ZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL2Jvb3RzZXEudHh0IGIvYm9hcmQvTWFydmVsbC9jb21tb24vYm9vdHNlcS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4YzJmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL2Jvb3RzZXEudHh0CkBAIC0wLDAgKzEsOTQgQEAKKyhjcHUvbXBjN3h4eC9zdGFydC5TKQorCitzdGFydDoKKyAgICBiIGJvb3RfY29sZAorCitzdGFydF93YXJtOgorICAgIGIgYm9vdF93YXJtCisKKworYm9vdF9jb2xkOgorYm9vdF93YXJtOgorICAgIGNsZWFyIGJhdHMKKyAgICBpbml0IGwyIChpZiBlbmFibGVkKQorICAgIGluaXQgYWx0aXZlYyAoaWYgZW5hYmxlZCkKKyAgICBpbnZhbGlkYXRlIGwyIChpZiBlbmFibGVkKQorICAgIHNldHVwIGJhdHMgKGZyb20gZGVmaW5lcyBpbiBjb25maWdfRVZCKQorICAgIGVuYWJsZV9hZGRyX3RyYW5zOiAoaWYgTU1VIGVuYWJsZWQpCisJZW5hYmxlIE1TUl9JUiBhbmQgTVNSX0RSCisgICAganVtcCB0byBpbl9mbGFzaAorCitpbl9mbGFzaDoKKyAgICBlbmFibGUgbDEgZGNhY2hlCisgICAgZ2FsX2xvd19pbml0OiAoYm9hcmQvZXZiNjQyNjAvc2RyYW1faW5pdC5TKQorCWNvbmZpZyBTRFJBTSAoQ0ZHLCBUSU1JTkcsIERFQ09ERSkKKwlpbml0IHNjcmF0Y2ggcmVncyAoODEwICsgODE0KQorCisJZGV0ZWN0IERJTU0wIChiYW5rIDAgb25seSkKKwljb25maWcgU0RSQU1fUEFSQTAgdG8gMjU2LzUxMk1iaXQKKwlibCBzZHJhbV9vcF9tb2RlCisJZGV0ZWN0IGJhbmswIHdpZHRoCisJICAgIHdyaXRlIHNjcmF0Y2ggcmVnIDgxMAorCWNvbmZpZyBTRFJBTV9QQVJBMCB3aXRoIHJlc3VsdHMKKwljb25maWcgU0RSQU1fUEFSQTEgd2l0aCByZXN1bHRzCisKKwlkZXRlY3QgRElNTTEgKGJhbmsgMiBvbmx5KQorCWNvbmZpZyBTRFJBTV9QQVJBMiB0byAyNTYvNTEyTWJpdAorCWRldGVjdCBiYW5rMiB3aWR0aAorCSAgICB3cml0ZSBzY3JhdGNoIHJlZyA4MTQKKwljb25maWcgU0RSQU1fUEFSQTIgd2l0aCByZXN1bHRzCisJY29uZmlnIFNEUkFNX1BBUkEzIHdpdGggcmVzdWx0cworCisJc2V0dXAgZGV2aWNlIGJ1cyB0aW1pbmdzL3dpZHRoCisJc2V0dXAgYm9vdCBkZXZpY2UgdGltaW5ncy93aWR0aAorCisJc2V0dXAgQ1BVX0NPTkYgKDB4MCkKKwlzZXR1cCBjcHUgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXIgMHgxNjAKKwlzZXR1cCBQQ0kwIFRJTUVPVVQKKwlzZXR1cCBQQ0kxIFRJTUVPVVQKKwlzZXR1cCBQQ0kwIEJBUgorCXNldHVwIFBDSTEgQkFSCisKKwlzZXR1cCBNUFAgY29udHJvbCAwLTMKKwlzZXR1cCBHUFAgbGV2ZWwgY29udHJvbAorCXNldHVwIFNlcmlhbCBwb3J0cyBtdWx0aXBsZXgKKworICAgIHNldHVwIHN0YWNrIHBvaW50ZXIgKHIxKQorICAgIHNldHVwIEdPVAorICAgIGNhbGwgY3B1X2luaXRfZgorICAgIAlkZWJ1ZyBsZWRzCisgICAgYm9hcmRfaW5pdF9mOiAoY29tbW9uL2JvYXJkLmMpCisJYm9hcmRfcHJlX2luaXQ6CisJICAgIHJlbWFwIGd0IHJlZ3M/CisJICAgIG1hcCBQQ0kgbWVtL2lvCisJICAgIG1hcCBkZXZpY2Ugc3BhY2UKKwkgICAgY2xlYXIgb3V0IGludGVydXB0cworCWluaXRfdGltZWJhc2UKKwllbnZfaW5pdAorCXNlcmlhbF9pbml0CisJY29uc29sZV9pbml0X2YKKwlkaXNwbGF5X29wdGlvbnMKKwlpbml0ZHJhbTogKGJvYXJkL2V2YjY0MjYwL2V2YjY0MjYwLmMpCisJICAgIGRldGVjdCBtZW1vcnkKKwkgICAgZm9yIGVhY2ggYmFuazoKKwkJZHJhbV9zaXplKCkKKwkJc2V0dXAgUENJIHNsYXZlIG1lbW9yeSBtYXBwaW5ncworCQlzZXR1cCBTQ1MKKyAgIAlzZXR1cCBtb25pdG9yCisJYWxsb2MgYm9hcmQgaW5mbyBzdHJ1Y3QKKwlpbml0IGJkIHN0cnVjdAorCXJlbG9jYXRlX2NvZGU6IChjcHUvbXBjN3h4eC9zdGFydC5TKQorCSAgICBjb3B5LGdvdCxjbGVhcmJzcworCSAgICBib2FyZF9pbml0X3IoYmQsIGRlc3RfYWRkcikgKGNvbW1vbi9ib2FyZC5jKQorCQlzZXR1cCBiZCBmdW5jdGlvbiBwb2ludGVycworCQl0cmFwX2luaXQKKwkJZmxhc2hfaW5pdDogKGJvYXJkL2V2YjY0MjYwL2ZsYXNoLmMpCisJCXNldHVwIGJkIGZsYXNoIGluZm8KKwkJY3B1X2luaXRfcjogKGNwdS9tcGM3eHh4L2NwdV9pbml0LmMpCisJCSAgICBub3RoaW5nCisJCW1lbV9tYWxsb2NfaW5pdAorCQltYWxsb2NfYmluX3JlbG9jCisJCXNwaV9pbml0IChyIG9yIGYpPz8/IChDRkdfRU5WX0lTX0lOX0VFUFJPTSkKKwkJZW52X3JlbG9jYXRlZAorCQltaXNjX2luaXRfcihiZCk6IChib2FyZC9ldmI2NDI2MC9ldmI2NDI2MC5jKQorCQkgICAgbXBzY19pbml0MgpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9jb21tb24vZWNjdGVzdC5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vZWNjdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDdiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9lY2N0ZXN0LmMKQEAgLTAsMCArMSwxMzMgQEAKK2luZGVudDogU3RhbmRhcmQgaW5wdXQ6NDk6IFdhcm5pbmc6b2xkIHN0eWxlIGFzc2lnbm1lbnQgYW1iaWd1aXR5IGluICI9KiIuICBBc3N1bWluZyAiPSAqIgorCisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmZGVmIEVDQ19URVNUCitzdGF0aWMgaW5saW5lIHZvaWQgZWNjX29mZiAodm9pZCkKK3sKKwkqKHZvbGF0aWxlIGludCAqKSAoSU5URVJOQUxfUkVHX0JBU0VfQUREUiArIDB4NGI0KSAmPSB+MHgwMDIwMDAwMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVjY19vbiAodm9pZCkKK3sKKwkqKHZvbGF0aWxlIGludCAqKSAoSU5URVJOQUxfUkVHX0JBU0VfQUREUiArIDB4NGI0KSB8PSAweDAwMjAwMDAwOworfQorCitzdGF0aWMgaW50IHB1dHNoZXggKGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlwcmludGYgKCIlMDJ4IiwgYnVmW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhcl9tZW1jcHkgKHZvaWQgKmQsIGNvbnN0IHZvaWQgKnMsIGludCBsZW4pCit7CisJaW50IGk7CisJY2hhciAqY2QgPSBkOworCWNvbnN0IGNoYXIgKmNzID0gczsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkqKGNkKyspID0gKihjcysrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVtb3J5X3Rlc3QgKGNoYXIgKmJ1ZikKK3sKKwljb25zdCBjaGFyIHNyY1tdWzE2XSA9IHsKKwkJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQl7MHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKwkJIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDF9LAorCQl7MHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwKKwkJIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDJ9LAorCQl7MHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwKKwkJIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDR9LAorCQl7MHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKwkJIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDh9LAorCQl7MHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MTB9LAorCQl7MHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwKKwkJIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjB9LAorCQl7MHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwgMHg0MCwKKwkJIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDB9LAorCQl7MHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKwkJIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODB9LAorCQl7MHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwKKwkJIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTV9LAorCQl7MHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwgMHhhYSwKKwkJIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWEsIDB4YWF9LAorCQl7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9CisJfTsKKwljb25zdCBpbnQgZm9vW10gPSB7IDAgfTsKKwlpbnQgaSwgaiwgYTsKKworCXByaW50ZiAoIlxudGVzdCBAICVkICVwXG4iLCBmb29bMF0sIGJ1Zik7CisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKwkJZm9yIChhID0gMDsgYSA8IDg7IGErKykgeworCQkJY29uc3QgY2hhciAqcyA9IHNyY1tpXSArIGE7CisJCQlpbnQgYWxpZ24gPSAodW5zaWduZWQpIChzKSAmIDB4NzsKKworCQkJLyogZWNjX29mZigpOyAqLworCQkJbWVtY3B5IChidWYsIHMsIDgpOworCQkJLyogZWNjX29uKCk7ICovCisJCQlwdXRzaGV4IChzLCA4KTsKKwkJCWlmIChtZW1jbXAgKGJ1ZiwgcywgOCkpIHsKKwkJCQlwdXRjICgnXG4nKTsKKwkJCQlwdXRzaGV4IChidWYsIDgpOworCQkJCXByaW50ZiAoIiBbRkFJTF0gKCVwKSBhbGlnbj0lZFxuIiwgcywgYWxpZ24pOworCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQkJc1tqXSA9PSBidWZbal0gPyBwdXRzICgiICAiKSA6CisJCQkJCQlwcmludGYgKCIlMDJ4IiwKKwkJCQkJCQkoc1tqXSkgXiAoYnVmW2pdKSk7CisJCQkJfQorCQkJCXB1dGMgKCdcbicpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYgKCIgW1BBU1NdICglcCkgYWxpZ249JWRcbiIsIHMsIGFsaWduKTsKKwkJCX0KKwkJCS8qIGVjY19vZmYoKTsgKi8KKwkJCWNoYXJfbWVtY3B5IChidWYsIHMsIDgpOworCQkJLyogZWNjX29uKCk7ICovCisJCQlwdXRzaGV4IChzLCA4KTsKKwkJCWlmIChtZW1jbXAgKGJ1ZiwgcywgOCkpIHsKKwkJCQlwdXRjICgnXG4nKTsKKwkJCQlwdXRzaGV4IChidWYsIDgpOworCQkJCXByaW50ZiAoIiBbRkFJTF0gKCVwKSBhbGlnbj0lZFxuIiwgcywgYWxpZ24pOworCQkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQkJc1tqXSA9PSBidWZbal0gPyBwdXRzICgiICAiKSA6CisJCQkJCQlwcmludGYgKCIlMDJ4IiwKKwkJCQkJCQkoc1tqXSkgXiAoYnVmW2pdKSk7CisJCQkJfQorCQkJCXB1dGMgKCdcbicpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYgKCIgW1BBU1NdICglcCkgYWxpZ249JWRcbiIsIHMsIGFsaWduKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9mbGFzaC5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmM1Yjc2Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9jb21tb24vZmxhc2guYwpAQCAtMCwwICsxLDEwNzIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBmbGFzaC5jIC0gZmxhc2ggc3VwcG9ydCBmb3IgdGhlIDUxMmssIDhiaXQgYm9vdCBmbGFzaAorIAlhbmQgdGhlIDhNQiAzMmJpdCBleHRyYSBmbGFzaCBvbiB0aGUgREI2NDM2MAorICogICAgICAgICAgIG1vc3Qgb2YgdGhpcyBmaWxlIHdhcyBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgVS1Cb290CisgKiAgICAgICAgICAgZmxhc2ggZHJpdmVycy4KKyAqCisgKiB3cml0dGVuIG9yIGNvbGxlY3RlZCBhbmQgc29tZXRpbWVzIHJld3JpdHRlbiBieQorICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjOHh4Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tdl9nZW5fcmVnLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tZW1vcnkuaCIKKyNpbmNsdWRlICJpbnRlbF9mbGFzaC5oIgorCisjZGVmaW5lIEZMQVNIX1JPTSAgICAgICAweEZGRkQJLyogdW5rbm93biBmbGFzaCB0eXBlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZMQVNIX1JBTSAgICAgICAweEZGRkUJLyogdW5rbm93biBmbGFzaCB0eXBlICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZMQVNIX01BTl9VTktOT1dOIDB4RkZGRjAwMDAKKworLyogI2RlZmluZSBERUJVRyAqLworCisvKiBJbnRlbCBmbGFzaCBjb21tYW5kcyAqLworaW50IGZsYXNoX2VyYXNlX2ludGVsIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCk7CitpbnQgd3JpdGVfd29yZF9pbnRlbCAoYmFua19hZGRyX3QgYWRkciwgYmFua193b3JkX3QgdmFsdWUpOworCitmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tDRkdfTUFYX0ZMQVNIX0JBTktTXTsJLyogaW5mbyBmb3IgRkxBU0ggY2hpcHMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb25zCisgKi8KK3N0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAoaW50IHBvcnR3aWR0aCwgdnVfbG9uZyAqIGFkZHIsCisJCQkgICAgIGZsYXNoX2luZm9fdCAqIGluZm8pOworc3RhdGljIGludCB3cml0ZV93b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKiBpbmZvKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3Vuc2lnbmVkIGxvbmcgZmxhc2hfaW5pdCAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNpemVfYjAgPSAwLCBzaXplX2IxID0gMDsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGZsYXNoX3NpemU7CisKKwkvKiBJbml0OiBubyBGTEFTSGVzIGtub3duICovCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwl9CisKKwkvKiB0aGUgYm9vdCBmbGFzaCAqLworCWJhc2UgPSBDRkdfRkxBU0hfQkFTRTsKKwlzaXplX2IwID0KKwkJZmxhc2hfZ2V0X3NpemUgKENGR19CT09UX0ZMQVNIX1dJRFRILCAodnVfbG9uZyAqKSBiYXNlLAorCQkJCSZmbGFzaF9pbmZvWzBdKTsKKworCXByaW50ZiAoIlslbGRrQkAlbHhdICIsIHNpemVfYjAgLyAxMDI0LCBiYXNlKTsKKworCWlmIChmbGFzaF9pbmZvWzBdLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJcHJpbnRmICgiIyMgVW5rbm93biBGTEFTSCBhdCAlMDhseDogU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsIGJhc2UsIHNpemVfYjAsIHNpemVfYjAgPDwgMjApOworCX0KKworCWJhc2UgPSBtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyAoQ0ZHX0VYVFJBX0ZMQVNIX0RFVklDRSk7CisvKgliYXNlID0gbWVtb3J5R2V0RGV2aWNlQmFzZUFkZHJlc3MoREVWX0NTM19CQVNFX0FERFIpOyovCisJZm9yIChpID0gMTsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHNpemUgPQorCQkJZmxhc2hfZ2V0X3NpemUgKENGR19FWFRSQV9GTEFTSF9XSURUSCwKKwkJCQkJKHZ1X2xvbmcgKikgYmFzZSwgJmZsYXNoX2luZm9baV0pOworCisJCXByaW50ZiAoIlslbGRNQkAlbHhdICIsIHNpemUgPj4gMjAsIGJhc2UpOworCisJCWlmIChmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCWlmIChpID09IDEpIHsKKwkJCQlwcmludGYgKCIjIyBVbmtub3duIEZMQVNIIGF0ICUwOGx4OiBTaXplID0gMHglMDhseCA9ICVsZCBNQlxuIiwgYmFzZSwgc2l6ZV9iMSwgc2l6ZV9iMSA8PCAyMCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlzaXplX2IxICs9IHNpemU7CisJCWJhc2UgKz0gc2l6ZTsKKwl9CisKKwlmbGFzaF9zaXplID0gc2l6ZV9iMCArIHNpemVfYjE7CisJcmV0dXJuIGZsYXNoX3NpemU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqIGluZm8pCit7CisJaW50IGk7CisJaW50IHNlY3Rvcl9zaXplOworCisJaWYgKCFpbmZvLT5zZWN0b3JfY291bnQpCisJCXJldHVybjsKKworCS8qIHNldCB1cCBzZWN0b3Igc3RhcnQgYWRkcmVzcyB0YWJsZSAqLworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCWNhc2UgRkxBU0hfQU0wNDA6CisJY2FzZSBGTEFTSF8yOEYxMjhKM0E6CisJY2FzZSBGTEFTSF8yOEY2NDBKM0E6CisJY2FzZSBGTEFTSF9SQU06CisJCS8qIHRoaXMgY2hpcCBoYXMgdW5pZm9ybWx5IHNwYWNlZCBzZWN0b3JzICovCisJCXNlY3Rvcl9zaXplID0gaW5mby0+c2l6ZSAvIGluZm8tPnNlY3Rvcl9jb3VudDsKKwkJZm9yIChpID0gMDsgaSA8IGluZm8tPnNlY3Rvcl9jb3VudDsgaSsrKQorCQkJaW5mby0+c3RhcnRbaV0gPSBiYXNlICsgKGkgKiBzZWN0b3Jfc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX0JUWVBFKSB7CisJCQkvKiBzZXQgc2VjdG9yIG9mZnNldHMgZm9yIGJvdHRvbSBib290IGJsb2NrIHR5cGUgICAgKi8KKwkJCWluZm8tPnN0YXJ0WzBdID0gYmFzZSArIDB4MDAwMDAwMDA7CisJCQlpbmZvLT5zdGFydFsxXSA9IGJhc2UgKyAweDAwMDA4MDAwOworCQkJaW5mby0+c3RhcnRbMl0gPSBiYXNlICsgMHgwMDAwQzAwMDsKKwkJCWluZm8tPnN0YXJ0WzNdID0gYmFzZSArIDB4MDAwMTAwMDA7CisJCQlmb3IgKGkgPSA0OyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJCQlpbmZvLT5zdGFydFtpXSA9CisJCQkJCWJhc2UgKyAoaSAqIDB4MDAwMjAwMDApIC0gMHgwMDA2MDAwMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHNldCBzZWN0b3Igb2Zmc2V0cyBmb3IgdG9wIGJvb3QgYmxvY2sgdHlwZSAgICAgICAgICAgICAgICovCisJCQlpID0gaW5mby0+c2VjdG9yX2NvdW50IC0gMTsKKwkJCWluZm8tPnN0YXJ0W2ktLV0gPSBiYXNlICsgaW5mby0+c2l6ZSAtIDB4MDAwMDgwMDA7CisJCQlpbmZvLT5zdGFydFtpLS1dID0gYmFzZSArIGluZm8tPnNpemUgLSAweDAwMDBDMDAwOworCQkJaW5mby0+c3RhcnRbaS0tXSA9IGJhc2UgKyBpbmZvLT5zaXplIC0gMHgwMDAxMDAwMDsKKwkJCWZvciAoOyBpID49IDA7IGktLSkgeworCQkJCWluZm8tPnN0YXJ0W2ldID0gYmFzZSArIGkgKiAweDAwMDIwMDAwOworCQkJfQorCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAoZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwlpbnQgaTsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCXByaW50ZiAoIm1pc3Npbmcgb3IgdW5rbm93biBGTEFTSCB0eXBlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCWNhc2UgRkxBU0hfTUFOX1NUTToKKwkJcHJpbnRmICgiU1RNICIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9BTUQ6CisJCXByaW50ZiAoIkFNRCAiKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9NQU5fRlVKOgorCQlwcmludGYgKCJGVUpJVFNVICIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX01BTl9JTlRFTDoKKwkJcHJpbnRmICgiSU5URUwgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gVmVuZG9yICIpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spIHsKKwljYXNlIEZMQVNIX0FNMDQwOgorCQlwcmludGYgKCJBTTI5TFYwNDBCICg0IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTQwMEI6CisJCXByaW50ZiAoIkFNMjlMVjQwMEIgKDQgTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNNDAwVDoKKwkJcHJpbnRmICgiQU0yOUxWNDAwVCAoNCBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTgwMEI6CisJCXByaW50ZiAoIkFNMjlMVjgwMEIgKDggTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNODAwVDoKKwkJcHJpbnRmICgiQU0yOUxWODAwVCAoOCBNYml0LCB0b3AgYm9vdCBzZWN0b3IpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTE2MEI6CisJCXByaW50ZiAoIkFNMjlMVjE2MEIgKDE2IE1iaXQsIGJvdHRvbSBib290IHNlY3QpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9BTTE2MFQ6CisJCXByaW50ZiAoIkFNMjlMVjE2MFQgKDE2IE1iaXQsIHRvcCBib290IHNlY3RvcilcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMzIwQjoKKwkJcHJpbnRmICgiQU0yOUxWMzIwQiAoMzIgTWJpdCwgYm90dG9tIGJvb3Qgc2VjdClcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIX0FNMzIwVDoKKwkJcHJpbnRmICgiQU0yOUxWMzIwVCAoMzIgTWJpdCwgdG9wIGJvb3Qgc2VjdG9yKVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfMjhGNjQwSjNBOgorCQlwcmludGYgKCIyOEY2NDBKM0EgKDY0IE1iaXQpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF8yOEYxMjhKM0E6CisJCXByaW50ZiAoIjI4RjEyOEozQSAoMTI4IE1iaXQpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF9ST006CisJCXByaW50ZiAoIlJPTVxuIik7CisJCWJyZWFrOworCWNhc2UgRkxBU0hfUkFNOgorCQlwcmludGYgKCJSQU1cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCWlmICgoaW5mby0+c2l6ZSA+PiAyMCkgPiAwKSB7CisJCXByaW50ZiAoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCisJCQlpbmZvLT5zaXplID4+IDIwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCX0gZWxzZSB7CisJCXByaW50ZiAoIiAgU2l6ZTogJWxkIGtCIGluICVkIFNlY3RvcnNcbiIsCisJCQlpbmZvLT5zaXplID4+IDEwLCBpbmZvLT5zZWN0b3JfY291bnQpOworCX0KKworCXByaW50ZiAoIiAgU2VjdG9yIFN0YXJ0IEFkZHJlc3NlczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKwkJaWYgKChpICUgNSkgPT0gMCkKKwkJCXByaW50ZiAoIlxuICAgIik7CisJCXByaW50ZiAoIiAlMDhsWCVzIiwKKwkJCWluZm8tPnN0YXJ0W2ldLCBpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworCX0KKwlwcmludGYgKCJcbiIpOworCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIHJ1biBmcm9tIEZMQVNIIQorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbGFzaF9jbWQgKGludCB3aWR0aCwgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCSAgICAgIGludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgY21kKQoreworCS8qIHN1cHBvcnRzIDF4OCwgMXgxNiwgYW5kIDJ4MTYgKi8KKwkvKiAyeDggYW5kIDR4OCBhcmUgbm90IHN1cHBvcnRlZCAqLworCWlmICh3aWR0aCA9PSA0KSB7CisJCS8qIGFzc3VtaW5nIGNoaXBzIGFyZSBpbiAxNiBiaXQgbW9kZSAqLworCQkvKiAyeDE2ICovCisJCXVuc2lnbmVkIGxvbmcgY21kMzIgPSAoY21kIDw8IDE2KSB8IGNtZDsKKworCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGFkZHIgKyBvZmZzZXQgKiAyKSA9IGNtZDMyOworCX0gZWxzZSB7CisJCS8qIDF4MTYgb3IgMXg4ICovCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoYWRkciArIG9mZnNldCkgPSBjbWQ7CisJfQorfQorCitzdGF0aWMgdWxvbmcKK2ZsYXNoX2dldF9zaXplIChpbnQgcG9ydHdpZHRoLCB2dV9sb25nICogYWRkciwgZmxhc2hfaW5mb190ICogaW5mbykKK3sKKwlzaG9ydCBpOworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNhZGRyID0gKHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqc2FkZHIgPSAodW5zaWduZWQgc2hvcnQgKikgYWRkcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpsYWRkciA9ICh1bnNpZ25lZCBsb25nICopIGFkZHI7CisJY2hhciBvbGRbMl0sIHNhdmU7CisJdWxvbmcgaWQgPSAwLCBtYW51ID0gMCwgYmFzZSA9ICh1bG9uZykgYWRkcjsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmICgiJXM6IGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworI2VuZGlmCisJaW5mby0+cG9ydHdpZHRoID0gcG9ydHdpZHRoOworCisJc2F2ZSA9ICpjYWRkcjsKKworCWZsYXNoX2NtZCAocG9ydHdpZHRoLCBjYWRkciwgMCwgMHhmMCk7CisJZmxhc2hfY21kIChwb3J0d2lkdGgsIGNhZGRyLCAwLCAweGYwKTsKKworCXVkZWxheSAoMTApOworCisJb2xkWzBdID0gY2FkZHJbMF07CisJb2xkWzFdID0gY2FkZHJbMV07CisKKworCWlmIChvbGRbMF0gIT0gMHhmMCkgeworCQlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4ZjApOworCQlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4ZjApOworCisJCXVkZWxheSAoMTApOworCisJCWlmICgqY2FkZHIgPT0gMHhmMCkgeworCQkJLyogdGhpcyBhcmVhIGlzIFJPTSAqLworCQkJKmNhZGRyID0gc2F2ZTsKKwkJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfUk9NICsgRkxBU0hfTUFOX1VOS05PV047CisJCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQkJaW5mby0+c2l6ZSA9IDB4ODAwMDA7CisJCQlmbGFzaF9nZXRfb2Zmc2V0cyAoYmFzZSwgaW5mbyk7CisJCQlyZXR1cm4gaW5mby0+c2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCSpjYWRkciA9IDA7CisKKwkJdWRlbGF5ICgxMCk7CisKKwkJaWYgKCpjYWRkciA9PSAwKSB7CisJCQkvKiB0aGlzIGFyZWEgaXMgUkFNICovCisJCQkqY2FkZHIgPSBzYXZlOworCQkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9SQU0gKyBGTEFTSF9NQU5fVU5LTk9XTjsKKwkJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDg7CisJCQlpbmZvLT5zaXplID0gMHg4MDAwMDsKKwkJCWZsYXNoX2dldF9vZmZzZXRzIChiYXNlLCBpbmZvKTsKKwkJCXJldHVybiBpbmZvLT5zaXplOworCQl9CisJCWZsYXNoX2NtZCAocG9ydHdpZHRoLCBjYWRkciwgMCwgMHhmMCk7CisKKwkJdWRlbGF5ICgxMCk7CisJfQorCisJLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KKwlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDB4NTU1LCAweEFBKTsKKwlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDB4MkFBLCAweDU1KTsKKwlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDB4NTU1LCAweDkwKTsKKworCXVkZWxheSAoMTApOworCisJaWYgKChjYWRkclswXSA9PSBvbGRbMF0pICYmIChjYWRkclsxXSA9PSBvbGRbMV0pKSB7CisKKwkJLyogdGhpcyBhcmVhIGlzIFJPTSAqLworCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1JPTSArIEZMQVNIX01BTl9VTktOT1dOOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQlpbmZvLT5zaXplID0gMHg4MDAwMDsKKwkJZmxhc2hfZ2V0X29mZnNldHMgKGJhc2UsIGluZm8pOworCQlyZXR1cm4gaW5mby0+c2l6ZTsKKyNpZmRlZiBERUJVRworCX0gZWxzZSB7CisJCXByaW50ZiAoIiVweCVkOiAlMDJ4OiUwMnggLT4gJTAyeDolMDJ4XG4iLAorCQkJY2FkZHIsIHBvcnR3aWR0aCwgb2xkWzBdLCBvbGRbMV0sIGNhZGRyWzBdLCBjYWRkclsxXSk7CisjZW5kaWYKKwl9CisKKwlzd2l0Y2ggKHBvcnR3aWR0aCkgeworCWNhc2UgMToKKwkJbWFudSA9IGNhZGRyWzBdOworCQltYW51IHw9IG1hbnUgPDwgMTY7CisJCWlkID0gY2FkZHJbMV07CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWFudSA9IHNhZGRyWzBdOworCQltYW51IHw9IG1hbnUgPDwgMTY7CisJCWlkID0gc2FkZHJbMV07CisJCWlkIHw9IGlkIDw8IDE2OworCQlicmVhazsKKwljYXNlIDQ6CisJCW1hbnUgPSBsYWRkclswXTsKKwkJaWQgPSBsYWRkclsxXTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgREVCVUcKKwlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4ZjApOworCisJcHJpbnRmICgiXG4lMDhseDolMDhseDolMDhseFxuIiwgYmFzZSwgbWFudSwgaWQpOworCXByaW50ZiAoIiUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAorCQlsYWRkclswXSwgbGFkZHJbMV0sIGxhZGRyWzJdLCBsYWRkclszXSk7CisjZW5kaWYKKworCXN3aXRjaCAobWFudSkgeworCWNhc2UgU1RNX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9TVE07CisJCWJyZWFrOworCWNhc2UgQU1EX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9BTUQ7CisJCWJyZWFrOworCWNhc2UgRlVKX01BTlVGQUNUOgorCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX01BTl9GVUo7CisJCWJyZWFrOworCWNhc2UgSU5URUxfTUFOVUZBQ1Q6CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfTUFOX0lOVEVMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4ZjApOworCisJCXByaW50ZiAoIlVua25vd24gTWZyIFslMDhseF06JTA4bHhcbiIsIG1hbnUsIGlkKTsKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9VTktOT1dOOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAwOworCQlpbmZvLT5zaXplID0gMDsKKwkJcmV0dXJuICgwKTsJLyogbm8gb3IgdW5rbm93biBmbGFzaCAgKi8KKwl9CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBBTURfSURfTFY0MDBUOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTQwMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDExOworCQlpbmZvLT5zaXplID0gMHgwMDEwMDAwMDsKKwkJaW5mby0+Y2hpcHdpZHRoID0gMTsKKwkJYnJlYWs7CQkvKiA9PiAxIE1CICAgICAgKi8KKworCWNhc2UgQU1EX0lEX0xWNDAwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU00MDBCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMTsKKwkJaW5mby0+c2l6ZSA9IDB4MDAxMDAwMDA7CisJCWluZm8tPmNoaXB3aWR0aCA9IDE7CisJCWJyZWFrOwkJLyogPT4gMSBNQiAgICAgICovCisKKwljYXNlIEFNRF9JRF9MVjgwMFQ6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNODAwVDsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTk7CisJCWluZm8tPnNpemUgPSAweDAwMjAwMDAwOworCQlpbmZvLT5jaGlwd2lkdGggPSAxOworCQlicmVhazsJCS8qID0+IDIgTUIgICAgICAqLworCisJY2FzZSBBTURfSURfTFY4MDBCOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTgwMEI7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDE5OworCQlpbmZvLT5zaXplID0gMHgwMDIwMDAwMDsKKwkJaW5mby0+Y2hpcHdpZHRoID0gMTsKKwkJYnJlYWs7CQkvKiA9PiAyIE1CICAgICAgKi8KKworCWNhc2UgQU1EX0lEX0xWMTYwVDoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0xNjBUOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAzNTsKKwkJaW5mby0+c2l6ZSA9IDB4MDA0MDAwMDA7CisJCWluZm8tPmNoaXB3aWR0aCA9IDE7CisJCWJyZWFrOwkJLyogPT4gNCBNQiAgICAgICovCisKKwljYXNlIEFNRF9JRF9MVjE2MEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMTYwQjsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMzU7CisJCWluZm8tPnNpemUgPSAweDAwNDAwMDAwOworCQlpbmZvLT5jaGlwd2lkdGggPSAxOworCQlicmVhazsJCS8qID0+IDQgTUIgICAgICAqLworI2lmIDAJCQkJLyogZW5hYmxlIHdoZW4gZGV2aWNlIElEcyBhcmUgYXZhaWxhYmxlICovCisJY2FzZSBBTURfSURfTFYzMjBUOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF9BTTMyMFQ7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDY3OworCQlpbmZvLT5zaXplID0gMHgwMDgwMDAwMDsKKwkJYnJlYWs7CQkvKiA9PiA4IE1CICAgICAgKi8KKworCWNhc2UgQU1EX0lEX0xWMzIwQjoKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfQU0zMjBCOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSA2NzsKKwkJaW5mby0+c2l6ZSA9IDB4MDA4MDAwMDA7CisJCWJyZWFrOwkJLyogPT4gOCBNQiAgICAgICovCisjZW5kaWYKKwljYXNlIEFNRF9JRF9MVjA0MEI6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIX0FNMDQwOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSA4OworCQlpbmZvLT5zaXplID0gMHg4MDAwMDsKKwkJaW5mby0+Y2hpcHdpZHRoID0gMTsKKwkJYnJlYWs7CQkvKiA9PiA1MTIga0IgICAgKi8KKworCWNhc2UgSU5URUxfSURfMjhGNjQwSjNBOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEY2NDBKM0E7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDY0OworCQlpbmZvLT5zaXplID0gMTI4ICogMTAyNCAqIDY0OwkvKiAxMjhrYnl0ZXMgeCA2NCBibG9ja3MgKi8KKwkJaW5mby0+Y2hpcHdpZHRoID0gMjsKKwkJaWYgKHBvcnR3aWR0aCA9PSA0KQorCQkJaW5mby0+c2l6ZSAqPSAyOwkvKiAyeDE2ICovCisJCWJyZWFrOworCisJY2FzZSBJTlRFTF9JRF8yOEYxMjhKM0E6CisJCWluZm8tPmZsYXNoX2lkICs9IEZMQVNIXzI4RjEyOEozQTsKKwkJaW5mby0+c2VjdG9yX2NvdW50ID0gMTI4OworCQlpbmZvLT5zaXplID0gMTI4ICogMTAyNCAqIDEyODsJLyogMTI4a2J5dGVzIHggMTI4IGJsb2NrcyAqLworCQlpbmZvLT5jaGlwd2lkdGggPSAyOworCQlpZiAocG9ydHdpZHRoID09IDQpCisJCQlpbmZvLT5zaXplICo9IDI7CS8qIDJ4MTYgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4ZjApOworCisJCXByaW50ZiAoIlVua25vd24gaWQgJWx4OlslbHhdXG4iLCBtYW51LCBpZCk7CisJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKKwkJaW5mby0+Y2hpcHdpZHRoID0gMTsKKwkJcmV0dXJuICgwKTsJLyogPT4gbm8gb3IgdW5rbm93biBmbGFzaCAqLworCisJfQorCisJZmxhc2hfZ2V0X29mZnNldHMgKGJhc2UsIGluZm8pOworCisKKwkvKiBjaGVjayBmb3IgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKKwkJLyogcmVhZCBzZWN0b3IgcHJvdGVjdGlvbiBhdCBzZWN0b3IgYWRkcmVzcywgKEE3IC4uIEEwKT0weDAyICovCisJCS8qIEQwID0gMSBpZiBwcm90ZWN0ZWQgKi8KKwkJY2FkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoaW5mby0+c3RhcnRbaV0pOworCQlzYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSAoaW5mby0+c3RhcnRbaV0pOworCQlsYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChpbmZvLT5zdGFydFtpXSk7CisJCWlmIChwb3J0d2lkdGggPT0gMSkKKwkJCWluZm8tPnByb3RlY3RbaV0gPSBjYWRkclsyXSAmIDE7CisJCWVsc2UgaWYgKHBvcnR3aWR0aCA9PSAyKQorCQkJaW5mby0+cHJvdGVjdFtpXSA9IHNhZGRyWzJdICYgMTsKKwkJZWxzZQorCQkJaW5mby0+cHJvdGVjdFtpXSA9IGxhZGRyWzJdICYgMTsKKwl9CisKKwkvKgorCSAqIFByZXZlbnQgd3JpdGVzIHRvIHVuaW5pdGlhbGl6ZWQgRkxBU0guCisJICovCisJaWYgKGluZm8tPmZsYXNoX2lkICE9IEZMQVNIX1VOS05PV04pIHsKKwkJY2FkZHIgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSBpbmZvLT5zdGFydFswXTsKKworCQlmbGFzaF9jbWQgKHBvcnR3aWR0aCwgY2FkZHIsIDAsIDB4RjApOwkvKiByZXNldCBiYW5rICovCisJfQorCisJcmV0dXJuIChpbmZvLT5zaXplKTsKK30KKworaW50IGZsYXNoX2VyYXNlIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICphZGRyID0gKGNoYXIgKikgKGluZm8tPnN0YXJ0WzBdKTsKKwlpbnQgZmxhZywgcHJvdCwgc2VjdCwgbF9zZWN0OworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKy8qIG1vZGlmaWVkIHRvIHN1cHBvcnQgMngxNiBJbnRlbCBmbGFzaCAqLworLyogTm90ZSB0aGF0IHRoZSBjb2RlIHdpbGwgbm90IGV4aXQgb24gYSBmbGFzaCBlcmFzdXJlIGVycm9yIG9yIHRpbWVvdXQgKi8KKy8qIGJ1dCB3aWxsIHByaW50IGFuZCBlcnJvciBtZXNzYWdlIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nIHNlY3RvcnMgKi8KKy8qIHVudGlsIHRoZXkgYXJlIGFsbCBlcmFzZWQuICovCisvKiAxMC0xNi0yMDAyIFAuIE1hcmNoZXNlICovCisJdWxvbmcgbWFzazsKKwlpbnQgdGltZW91dDsKKworCWlmIChpbmZvLT5wb3J0d2lkdGggPT0gNCkKKy8qCQl7CisJCXByaW50ZiAoIi0gV2FybmluZzogZXJhc2luZyBvZiAzMkJpdCAoMioxNkJpdCBpLmUuIDIqMjhGNjQwSjNBKSBub3Qgc3VwcG9ydGVkIHlldCAhISEhIFxuIik7CisJCXJldHVybiAxOworCQl9Ki8KKwl7CisJCS8qIG1ha2Ugc3VyZSBpdCdzIEludGVsIGZsYXNoICovCisJCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX0lOVEVMKSB7CisJCQkvKiB5dXAhIGl0J3MgYW4gSW50ZWwgZmxhc2ggKi8KKwkJCS8qIGlzIGl0IDE2LWJpdHMgd2lkZT8gKi8KKwkJCWlmIChpbmZvLT5jaGlwd2lkdGggPT0gMikgeworCQkJCS8qIHl1cCEgaXQncyAxNi1iaXRzIHdpZGUgKi8KKwkJCQkvKiBhcmUgdGhlcmUgYW55IHNlY3RvcnMgdG8gcHJvY2Vzcz8gKi8KKwkJCQlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJCQkJcHJpbnRmICgiRXJyb3I6ICBUaGVyZSBhcmUgbm8gc2VjdG9ycyB0byBlcmFzZVxuIik7CisJCQkJCXByaW50ZiAoIkVpdGhlciBzZWN0b3IgJWQgaXMgbGVzcyB0aGFuIHplcm9cbiIsIHNfZmlyc3QpOworCQkJCQlwcmludGYgKCJvciBzZWN0b3IgJWQgaXMgZ3JlYXRlciB0aGFuIHNlY3RvciAlZFxuIiwgc19maXJzdCwgc19sYXN0KTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCS8qIGNoZWNrIGZvciBwcm90ZWN0ZWQgc2VjdG9ycyAqLworCQkJCXByb3QgPSAwOworCQkJCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpCisJCQkJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKQorCQkJCQkJcHJvdCsrOworCQkJCS8qIGlmIHZhcmlhYmxlICJwcm90IiBpcyBub256ZXJvLCB0aGVyZSBhcmUgcHJvdGVjdGVkIHNlY3RvcnMgKi8KKwkJCQlpZiAocHJvdCkKKwkJCQkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLCBwcm90KTsKKwkJCQkvKiByZXNldCB0aGUgZmxhc2ggKi8KKwkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMCwKKwkJCQkJICAgQ0hJUF9DTURfUlNUKTsKKwkJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwkJCQlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCQkJCS8qIENsZWFyIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMCwKKwkJCQkJICAgQ0hJUF9DTURfQ0xSX1NUQVQpOworCQkJCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAwLAorCQkJCQkgICBDSElQX0NNRF9SU1QpOworCQkJCS8qIFN0YXJ0IGVyYXNlIG9uIHVucHJvdGVjdGVkIHNlY3RvcnMgKi8KKwkJCQlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJCQkJCS8qIGlzIHRoZSBzZWN0b3IgdW5wcm90ZWN0ZWQ/ICovCisJCQkJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJCQkJLyogaXNzdWUgdGhlIHNpbmdsZSBibG9jayBlcmFzZSBjb21tYW5kLCAweDIwICovCisJCQkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwKKwkJCQkJCQkgICAodm9sYXRpbGUgdW5zaWduZWQKKwkJCQkJCQkgICAgY2hhciAqKSBpbmZvLT4KKwkJCQkJCQkgICBzdGFydFtzZWN0XSwgMCwKKwkJCQkJCQkgICBDSElQX0NNRF9FUkFTRTEpOworCQkJCQkJLyogaXNzdWUgdGhlIGVyYXNlIGNvbmZpcm0gY29tbWFuZCwgMHhEMCAqLworCQkJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsCisJCQkJCQkJICAgKHZvbGF0aWxlIHVuc2lnbmVkCisJCQkJCQkJICAgIGNoYXIgKikgaW5mby0+CisJCQkJCQkJICAgc3RhcnRbc2VjdF0sIDAsCisJCQkJCQkJICAgQ0hJUF9DTURfRVJBU0UyKTsKKwkJCQkJCWxfc2VjdCA9IHNlY3Q7CisJCQkJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJCQkJCWlmIChmbGFnKQorCQkJCQkJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworCQkJCQkJLyogcG9sbCBmb3IgZXJhc3VyZSBjb21wbGV0aW9uICovCisJCQkJCQkvKiBwdXQgZmxhc2ggaW50byByZWFkIHN0YXR1cyBtb2RlIGJ5IHdyaXRpbmcgMHg3MCB0byBpdCAqLworCQkJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsCisJCQkJCQkJICAgYWRkciwgMCwKKwkJCQkJCQkgICBDSElQX0NNRF9SRF9TVEFUKTsKKwkJCQkJCS8qIHNldHVwIHRoZSBzdGF0dXMgcmVnaXN0ZXIgbWFzayAqLworCQkJCQkJbWFzayA9IENISVBfU1RBVF9SRFkgfAorCQkJCQkJCShDSElQX1NUQVRfUkRZIDw8IDE2KTsKKwkJCQkJCS8qIGluaXQuIHRoZSB0aW1lb3V0IGNvdW50ZXIgKi8KKwkJCQkJCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwkJCQkJCS8qIGtlZXAgbG9vcGluZyB3aGlsZSB0aGUgZmxhc2ggaXMgbm90IHJlYWR5ICovCisJCQkJCQkvKiBleGl0IHRoZSBsb29wIGJ5IHRpbWluZyBvdXQgb3IgdGhlIGZsYXNoICovCisJCQkJCQkvKiBiZWNvbWVzIHJlYWR5IGFnYWluICovCisJCQkJCQl0aW1lb3V0ID0gMDsKKwkJCQkJCXdoaWxlICgoKgorCQkJCQkJCSh2b2xhdGlsZSB1bnNpZ25lZAorCQkJCQkJCSBsb25nICopIGluZm8tPgorCQkJCQkJCXN0YXJ0W3NlY3RdICYgbWFzaykgIT0KKwkJCQkJCSAgICAgICBtYXNrKSB7CisJCQkJCQkJLyogaGFzIHRoZSB0aW1lb3V0IGxpbWl0IGJlZW4gcmVhY2hlZD8gKi8KKwkJCQkJCQlpZiAoZ2V0X3RpbWVyIChzdGFydCkKKwkJCQkJCQkgICAgPgorCQkJCQkJCSAgICBDRkdfRkxBU0hfRVJBU0VfVE9VVCkKKwkJCQkJCQl7CisJCQkJCQkJCS8qIHRpbWVvdXQgbGltaXQgcmVhY2hlZCAqLworCQkJCQkJCQlwcmludGYgKCJUaW1lIG91dCBsaW1pdCByZWFjaGVkIGVyYXNpbmcgc2VjdG9yIGF0IGFkZHJlc3MgJTA4bHhcbiIsIGluZm8tPnN0YXJ0W3NlY3RdKTsKKwkJCQkJCQkJcHJpbnRmICgiQ29udGludWluZyB3aXRoIG5leHQgc2VjdG9yXG4iKTsKKwkJCQkJCQkJdGltZW91dCA9IDE7CisJCQkJCQkJCWdvdG8gdGltZWRfb3V0X2Vycm9yOworCQkJCQkJCX0KKwkJCQkJCQkvKiBwdXQgZmxhc2ggaW50byByZWFkIHN0YXR1cyBtb2RlIGJ5IHdyaXRpbmcgMHg3MCB0byBpdCAqLworCQkJCQkJCWZsYXNoX2NtZCAoaW5mby0+CisJCQkJCQkJCSAgIHBvcnR3aWR0aCwKKwkJCQkJCQkJICAgYWRkciwgMCwKKwkJCQkJCQkJICAgQ0hJUF9DTURfUkRfU1RBVCk7CisJCQkJCQl9CisJCQkJCQkvKiBkaWQgd2UgdGltZW91dD8gKi8KKwkJCQkJICAgICAgdGltZWRfb3V0X2Vycm9yOmlmICh0aW1lb3V0ID09IDApCisJCQkJCQl7CisJCQkJCQkJLyogZGlkbid0IHRpbWVvdXQsIHNvIGNoZWNrIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJCQkJCQkvKiBjcmVhdGUgdGhlIHN0YXR1cyBtYXNrIHRvIGNoZWNrIGZvciBlcnJvcnMgKi8KKwkJCQkJCQltYXNrID0gQ0hJUF9TVEFUX0VDTEJTOworCQkJCQkJCW1hc2sgPSBtYXNrIHwgKG1hc2sgPDwKKwkJCQkJCQkJICAgICAgIDE2KTsKKwkJCQkJCQkvKiBwdXQgZmxhc2ggaW50byByZWFkIHN0YXR1cyBtb2RlIGJ5IHdyaXRpbmcgMHg3MCB0byBpdCAqLworCQkJCQkJCWZsYXNoX2NtZCAoaW5mby0+CisJCQkJCQkJCSAgIHBvcnR3aWR0aCwKKwkJCQkJCQkJICAgYWRkciwgMCwKKwkJCQkJCQkJICAgQ0hJUF9DTURfUkRfU1RBVCk7CisJCQkJCQkJLyogYXJlIHRoZXJlIGFueSBlcnJvcnM/ICovCisJCQkJCQkJaWYgKCgqCisJCQkJCQkJICAgICAodm9sYXRpbGUKKwkJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICopCisJCQkJCQkJICAgICBpbmZvLT4KKwkJCQkJCQkgICAgIHN0YXJ0W3NlY3RdICYKKwkJCQkJCQkgICAgIG1hc2spICE9IDApIHsKKwkJCQkJCQkJLyogV2UgZ290IGFuIGVyYXN1cmUgZXJyb3IgKi8KKwkJCQkJCQkJcHJpbnRmICgiRmxhc2ggZXJhc3VyZSBlcnJvciBhdCBhZGRyZXNzIDB4JTA4bHhcbiIsIGluZm8tPnN0YXJ0W3NlY3RdKTsKKwkJCQkJCQkJcHJpbnRmICgiQ29udGludWluZyB3aXRoIG5leHQgc2VjdG9yXG4iKTsKKwkJCQkJCQkJLyogcmVzZXQgdGhlIGZsYXNoICovCisJCQkJCQkJCWZsYXNoX2NtZAorCQkJCQkJCQkJKGluZm8tPgorCQkJCQkJCQkJIHBvcnR3aWR0aCwKKwkJCQkJCQkJCSBhZGRyLAorCQkJCQkJCQkJIDAsCisJCQkJCQkJCQkgQ0hJUF9DTURfUlNUKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkvKiBlcmFzdXJlIGNvbXBsZXRlZCB3aXRob3V0IGVycm9ycyAqLworCQkJCQkJLyogcmVzZXQgdGhlIGZsYXNoICovCisJCQkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwKKwkJCQkJCQkgICBhZGRyLCAwLAorCQkJCQkJCSAgIENISVBfQ01EX1JTVCk7CisJCQkJCX0JLyogZW5kIGlmIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCQl9CS8qIGVuZCBmb3IgbG9vcCAqLworCQkJCXByaW50ZiAoIkZsYXNoIGVyYXN1cmUgZG9uZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBJbnRlbCBmbGFzaCBpcyBub3QgMTYtYml0IHdpZGUgKi8KKwkJCQkvKiBwcmludCBhbmQgZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJuICovCisJCQkJLyogTk9URTogeW91IGNhbiBhZGQgcm91dGluZXMgaGVyZSB0byBoYW5kbGUgb3RoZXIgc2l6ZSBmbGFzaCAqLworCQkJCXByaW50ZiAoIkVycm9yOiBJbnRlbCBmbGFzaCBkZXZpY2UgaXMgb25seSAlZC1iaXRzIHdpZGVcbiIsIGluZm8tPmNoaXB3aWR0aCAqIDgpOworCQkJCXByaW50ZiAoIlRoZSBlcmFzdXJlIGNvZGUgb25seSBoYW5kbGVzIEludGVsIDE2LWJpdCB3aWRlIGZsYXNoIG1lbW9yeVxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBOb3QgSW50ZWwgZmxhc2ggc28gcmV0dXJuIGFuIGVycm9yIGFzIGEgd3JpdGUgdGltZW91dCAqLworCQkJLyogTk9URTogaWYgaXQncyBhbm90aGVyIHR5cGUgZmxhc2gsIHN0aWNrIGl0cyByb3V0aW5lIGhlcmUgKi8KKwkJCXByaW50ZiAoIkVycm9yOiBUaGUgZmxhc2ggZGV2aWNlIGlzIG5vdCBJbnRlbCB0eXBlXG4iKTsKKwkJCXByaW50ZiAoIlRoZSBlcmFzdXJlIGNvZGUgb25seSBzdXBwb3J0cyBJbnRlbCBmbGFzaCBpbiBhIDMyLWJpdCBwb3J0IHdpZHRoXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogZW5kIDMyLWJpdCB3aWRlIGZsYXNoIGNvZGUgKi8KKwlpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVFlQRU1BU0spID09IEZMQVNIX1JPTSkKKwkJcmV0dXJuIDE7CS8qIFJvbSBjYW4gbm90IGJlIGVyYXNlZCAqLworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfUkFNKSB7CS8qIFJBTSBqdXN0IGNvcHkgMHMgdG8gUkFNICovCisJCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJCWludCBzZWN0b3Jfc2l6ZSA9IGluZm8tPnNpemUgLyBpbmZvLT5zZWN0b3JfY291bnQ7CisKKwkJCWFkZHIgPSAoY2hhciAqKSAoaW5mby0+c3RhcnRbc2VjdF0pOworCQkJbWVtc2V0ICgodm9pZCAqKSBhZGRyLCAwLCBzZWN0b3Jfc2l6ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChzX2ZpcnN0IDwgMCkgfHwgKHNfZmlyc3QgPiBzX2xhc3QpKSB7CisJCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CisJCQlwcmludGYgKCItIG1pc3NpbmdcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmICgiLSBubyBzZWN0b3JzIHRvIGVyYXNlXG4iKTsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spID09IEZMQVNIX01BTl9JTlRFTCkgewkvKiBJbnRlbCB3b3JrcyBzcGV6aWFsICovCisJCXJldHVybiBmbGFzaF9lcmFzZV9pbnRlbCAoaW5mbywKKwkJCQkJICAodW5zaWduZWQgc2hvcnQpIHNfZmlyc3QsCisJCQkJCSAgKHVuc2lnbmVkIHNob3J0KSBzX2xhc3QpOworCX0KKyNpZiAwCisJaWYgKChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB8fAkvKiBGbGFzaCBpcyB1bmtub3duIHRvIFBQQ0Jvb3QgKi8KKwkgICAgKGluZm8tPmZsYXNoX2lkID4gRkxBU0hfQU1EX0NPTVApKSB7CisJCXByaW50ZiAoIkNhbid0IGVyYXNlIHVua25vd24gZmxhc2ggdHlwZSAlMDhseCAtIGFib3J0ZWRcbiIsCisJCQlpbmZvLT5mbGFzaF9pZCk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJcHJvdCA9IDA7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7ICsrc2VjdCkgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgeworCQkJcHJvdCsrOworCQl9CisJfQorCisJaWYgKHByb3QpIHsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiAlZCBwcm90ZWN0ZWQgc2VjdG9ycyB3aWxsIG5vdCBiZSBlcmFzZWQhXG4iLCBwcm90KTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJcbiIpOworCX0KKworCWxfc2VjdCA9IC0xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAweDU1NSwgMHhBQSk7CS8qIHN0YXJ0IGVyYXNlIHJvdXRpbmUgKi8KKwlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMHgyQUEsIDB4NTUpOworCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAweDU1NSwgMHg4MCk7CisJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDB4NTU1LCAweEFBKTsKKwlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMHgyQUEsIDB4NTUpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyBzZWN0KyspIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0gPT0gMCkgewkvKiBub3QgcHJvdGVjdGVkICovCisJCQlhZGRyID0gKGNoYXIgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKKwkJCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAwLCAweDMwKTsKKwkJCWxfc2VjdCA9IHNlY3Q7CisJCX0KKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKwl1ZGVsYXkgKDEwMDApOworCisJLyoKKwkgKiBXZSB3YWl0IGZvciB0aGUgbGFzdCB0cmlnZ2VyZWQgc2VjdG9yCisJICovCisJaWYgKGxfc2VjdCA8IDApCisJCWdvdG8gRE9ORTsKKworCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwlsYXN0ID0gc3RhcnQ7CisJYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIChpbmZvLT5zdGFydFtsX3NlY3RdKTsKKwkvKiBicm9rZW4gZm9yIDJ4MTY6IFRPRE8gKi8KKwl3aGlsZSAoKGFkZHJbMF0gJiAweDgwKSAhPSAweDgwKSB7CisJCWlmICgobm93ID0gZ2V0X3RpbWVyIChzdGFydCkpID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCXByaW50ZiAoIlRpbWVvdXRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKwkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCisJCQlwdXRjICgnLicpOworCQkJbGFzdCA9IG5vdzsKKwkJfQorCX0KKworICAgICAgRE9ORToKKwkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KKwlhZGRyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgaW5mby0+c3RhcnRbMF07CisJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDAsIDB4ZjApOworCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAwLCAweGYwKTsKKworCXByaW50ZiAoIiBkb25lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weSBtZW1vcnkgdG8gZmxhc2gsIHJldHVybnM6CisgKiAwIC0gT0sKKyAqIDEgLSB3cml0ZSB0aW1lb3V0CisgKiAyIC0gRmxhc2ggbm90IGVyYXNlZAorICovCisKKy8qIGJyb2tlbiBmb3IgMngxNjogVE9ETyAqLworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyICogc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCit7CisJdWxvbmcgY3AsIHdwLCBkYXRhOworCWludCBpLCBsLCByYzsKKworLyogQ29tbWVudGVkIG91dCBzaW5jZSB0aGUgYmVsb3cgY29kZSBzaG91bGQgd29yayBmb3IgMzItYml0KDJ4IDE2IGZsYXNoKSAqLworLyogMTAtMTYtMjAwMiBQLiBNYXJjaGVzZSAqLworLyoJaWYoaW5mby0+cG9ydHdpZHRoPT00KSByZXR1cm4gMTsgKi8KKy8qCWlmKGluZm8tPnBvcnR3aWR0aD09NCkgeworCQlwcmludGYgKCItIFdhcm5pbmc6IHdyaXR0aW5nIG9mIDMyQml0ICgyKjE2Qml0IGkuZS4gMioyOEY2NDBKM0EpIG5vdCBzdXBwb3J0ZWQgeWV0ICEhISEgXG4iKTsKKwkJcmV0dXJuIDE7CisJCX0qLworCisJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9ST00pCisJCXJldHVybiAwOworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfUkFNKSB7CisJCW1lbWNweSAoKHZvaWQgKikgYWRkciwgc3JjLCBjbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cCA9IChhZGRyICYgfjMpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisJCWZvciAoOyBpIDwgNCAmJiBjbnQgPiAwOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJCS0tY250OworCQkJKytjcDsKKwkJfQorCQlmb3IgKDsgY250ID09IDAgJiYgaSA8IDQ7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOworCQl9CisKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gNDsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gNCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOworCQl9CisJCWlmICgocmMgPSB3cml0ZV93b3JkIChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJCXJldHVybiAocmMpOworCQl9CisJCXdwICs9IDQ7CisJCWNudCAtPSA0OworCX0KKworCWlmIChjbnQgPT0gMCkgeworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IDQgJiYgY250ID4gMDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKKwkJLS1jbnQ7CisJfQorCWZvciAoOyBpIDwgNDsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKKwl9CisKKwlyZXR1cm4gKHdyaXRlX3dvcmQgKGluZm8sIHdwLCBkYXRhKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyaXRlIGEgd29yZCB0byBGbGFzaCwgcmV0dXJuczoKKyAqIDAgLSBPSworICogMSAtIHdyaXRlIHRpbWVvdXQKKyAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCisgKi8KKy8qIGJyb2tlbiBmb3IgMngxNjogVE9ETyAqLworc3RhdGljIGludCB3cml0ZV93b3JkIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmFkZHIgPSAoY2hhciAqKSAoaW5mby0+c3RhcnRbMF0pOworCXVsb25nIHN0YXJ0OworCWludCBmbGFnLCBpOworCXVsb25nIG1hc2s7CisKKy8qIG1vZGlmaWVkIHNvIHRoYXQgaXQgaGFuZGxlcyAzMi1iaXQoMngxNiBJbnRlbCBmbGFzaCBwcm9ncmFtbWluZyAqLworLyogMTAtMTYtMjAwMiBQLiBNYXJjaGVzZSAqLworCisJaWYgKGluZm8tPnBvcnR3aWR0aCA9PSA0KQorLyoJCXsKKwkJcHJpbnRmICgiLSBXYXJuaW5nOiB3cml0dGluZyBvZiAzMkJpdCAoMioxNkJpdCBpLmUuIDIqMjhGNjQwSjNBKSBub3Qgc3VwcG9ydGVkIHlldCAhISEhIFxuIik7CisJCXJldHVybiAxOworCQl9Ki8KKwl7CisJCS8qIG1ha2Ugc3VyZSBpdCdzIEludGVsIGZsYXNoICovCisJCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX0lOVEVMKSB7CisJCQkvKiB5dXAhIGl0J3MgYW4gSW50ZWwgZmxhc2ggKi8KKwkJCS8qIGlzIGl0IDE2LWJpdHMgd2lkZT8gKi8KKwkJCWlmIChpbmZvLT5jaGlwd2lkdGggPT0gMikgeworCQkJCS8qIHl1cCEgaXQncyAxNi1iaXRzIHdpZGUgKi8KKwkJCQkvKiBzbyB3ZSBrbm93IGhvdyB0byBwcm9ncmFtIGl0ICovCisJCQkJLyogcmVzZXQgdGhlIGZsYXNoICovCisJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDAsCisJCQkJCSAgIENISVBfQ01EX1JTVCk7CisJCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWNoIG1pZ2h0IGNhdXNlIGEgdGltZW91dCBoZXJlICovCisJCQkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKwkJCQkvKiBDbGVhciB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDAsCisJCQkJCSAgIENISVBfQ01EX0NMUl9TVEFUKTsKKwkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMCwKKwkJCQkJICAgQ0hJUF9DTURfUlNUKTsKKwkJCQkvKiAxc3QgY3ljbGUgb2Ygd29yZC9ieXRlIHByb2dyYW0gKi8KKwkJCQkvKiB3cml0ZSAweDQwIHRvIHRoZSBsb2NhdGlvbiB0byBwcm9ncmFtICovCisJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIChjaGFyICopIGRlc3QsIDAsCisJCQkJCSAgIENISVBfQ01EX1BST0cpOworCQkJCS8qIDJuZCBjeWNsZSBvZiB3b3JkL2J5dGUgcHJvZ3JhbSAqLworCQkJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJCQkJKih1bG9uZyAqKSBkZXN0ID0gZGF0YTsKKwkJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwkJCQlpZiAoZmxhZykKKwkJCQkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisJCQkJLyogc2V0dXAgdGhlIHN0YXR1cyByZWdpc3RlciBtYXNrICovCisJCQkJbWFzayA9IENISVBfU1RBVF9SRFkgfCAoQ0hJUF9TVEFUX1JEWSA8PCAxNik7CisJCQkJLyogcHV0IGZsYXNoIGludG8gcmVhZCBzdGF0dXMgbW9kZSBieSB3cml0aW5nIDB4NzAgdG8gaXQgKi8KKwkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMCwKKwkJCQkJICAgQ0hJUF9DTURfUkRfU1RBVCk7CisJCQkJLyogaW5pdC4gdGhlIHRpbWVvdXQgY291bnRlciAqLworCQkJCXN0YXJ0ID0gZ2V0X3RpbWVyICgwKTsKKwkJCQkvKiBrZWVwIGxvb3Bpbmcgd2hpbGUgdGhlIGZsYXNoIGlzIG5vdCByZWFkeSAqLworCQkJCS8qIGV4aXQgdGhlIGxvb3AgYnkgdGltaW5nIG91dCBvciB0aGUgZmxhc2ggKi8KKwkJCQkvKiBiZWNvbWVzIHJlYWR5IGFnYWluICovCisvKiAxMS0xMy0yMDAyIFBhdWwgTWFyY2hlc2UgKi8KKy8qIG1vZGlmaWVkIHdoaWxlIGxvb3AgY29uZGl0aW9uYWwgc3RhdGVtZW50ICovCisvKiBiZWNhdXNlIHdlIHdlcmUgYWx3YXlzIHRpbWluZyBvdXQuICAqLworLyogdGhlcmUgaXMgYSB0eXBlIG1pc21hdGNoLCAiYWRkclswXSIgKi8KKy8qIHJldHVybnMgYSBieXRlIGJ1dCAibWFzayIgaXMgYSAzMi1iaXQgdmFsdWUgKi8KKwkJCQl3aGlsZSAoKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBpbmZvLT4KKwkJCQkJc3RhcnRbMF0gJiBtYXNrKSAhPSBtYXNrKQorLyogb3JpZ2luYWwgY29kZSAqLworLyogd2hpbGUgKGFkZHJbMF0gJiBtYXNrKSAhPSBtYXNrKSAqLworCQkJCXsKKwkJCQkJLyogaGFzIHRoZSB0aW1lb3V0IGxpbWl0IGJlZW4gcmVhY2hlZD8gKi8KKwkJCQkJaWYgKGdldF90aW1lciAoc3RhcnQpID4KKwkJCQkJICAgIENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJCQkJCQkvKiB0aW1lb3V0IGxpbWl0IHJlYWNoZWQgKi8KKwkJCQkJCXByaW50ZiAoIlRpbWUgb3V0IGxpbWl0IHJlYWNoZWQgcHJvZ3JhbW1pbmcgYWRkcmVzcyAlMDhseCB3aXRoIGRhdGEgJTA4bHhcbiIsIGRlc3QsIGRhdGEpOworCQkJCQkJLyogcmVzZXQgdGhlIGZsYXNoICovCisJCQkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwKKwkJCQkJCQkgICBhZGRyLCAwLAorCQkJCQkJCSAgIENISVBfQ01EX1JTVCk7CisJCQkJCQlyZXR1cm4gKDEpOworCQkJCQl9CisJCQkJCS8qIHB1dCBmbGFzaCBpbnRvIHJlYWQgc3RhdHVzIG1vZGUgYnkgd3JpdGluZyAweDcwIHRvIGl0ICovCisJCQkJCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAwLAorCQkJCQkJICAgQ0hJUF9DTURfUkRfU1RBVCk7CisJCQkJfQorCQkJCS8qIGZsYXNoIGlzIHJlYWR5LCBzbyBjaGVjayB0aGUgc3RhdHVzICovCisJCQkJLyogY3JlYXRlIHRoZSBzdGF0dXMgbWFzayB0byBjaGVjayBmb3IgZXJyb3JzICovCisJCQkJbWFzayA9IENISVBfU1RBVF9EUFMgfCBDSElQX1NUQVRfVlBQUyB8CisJCQkJCUNISVBfU1RBVF9QU0xCUzsKKwkJCQltYXNrID0gbWFzayB8IChtYXNrIDw8IDE2KTsKKwkJCQkvKiBwdXQgZmxhc2ggaW50byByZWFkIHN0YXR1cyBtb2RlIGJ5IHdyaXRpbmcgMHg3MCB0byBpdCAqLworCQkJCWZsYXNoX2NtZCAoaW5mby0+cG9ydHdpZHRoLCBhZGRyLCAwLAorCQkJCQkgICBDSElQX0NNRF9SRF9TVEFUKTsKKwkJCQkvKiBhcmUgdGhlcmUgYW55IGVycm9ycz8gKi8KKwkJCQlpZiAoKGFkZHJbMF0gJiBtYXNrKSAhPSAwKSB7CisJCQkJCS8qIFdlIGdvdCBhIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVycm9yczogKi8KKwkJCQkJLyogVm9sdGFnZSByYW5nZSwgRGV2aWNlIHByb3RlY3QsIG9yIHByb2dyYW1taW5nICovCisJCQkJCS8qIHJldHVybiB0aGUgZXJyb3IgYXMgYSBkZXZpY2UgdGltZW91dCAqLworCQkJCQkvKiBwdXQgZmxhc2ggaW50byByZWFkIHN0YXR1cyBtb2RlIGJ5IHdyaXRpbmcgMHg3MCB0byBpdCAqLworCQkJCQlmbGFzaF9jbWQgKGluZm8tPnBvcnR3aWR0aCwgYWRkciwgMCwKKwkJCQkJCSAgIENISVBfQ01EX1JEX1NUQVQpOworCQkJCQlwcmludGYgKCJGbGFzaCBwcm9ncmFtbWluZyBlcnJvciBhdCBhZGRyZXNzIDB4JTA4bHhcbiIsIGRlc3QpOworCQkJCQlwcmludGYgKCJGbGFzaCBzdGF0dXMgcmVnaXN0ZXIgY29udGFpbnMgMHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0pOworCQkJCQkvKiByZXNldCB0aGUgZmxhc2ggKi8KKwkJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDAsCisJCQkJCQkgICBDSElQX0NNRF9SU1QpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQkJLyogd3JpdGUgY29tcGxldGVkIHdpdGhvdXQgZXJyb3JzICovCisJCQkJLyogcmVzZXQgdGhlIGZsYXNoICovCisJCQkJZmxhc2hfY21kIChpbmZvLT5wb3J0d2lkdGgsIGFkZHIsIDAsCisJCQkJCSAgIENISVBfQ01EX1JTVCk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCS8qIGl0J3Mgbm90IDE2LWJpdHMgd2lkZSwgc28gcmV0dXJuIGFuIGVycm9yIGFzIGEgd3JpdGUgdGltZW91dCAqLworCQkJCS8qIE5PVEU6IHlvdSBjYW4gYWRkIHJvdXRpbmVzIGhlcmUgdG8gaGFuZGxlIG90aGVyIHNpemUgZmxhc2ggKi8KKwkJCQlwcmludGYgKCJFcnJvcjogSW50ZWwgZmxhc2ggZGV2aWNlIGlzIG9ubHkgJWQtYml0cyB3aWRlXG4iLCBpbmZvLT5jaGlwd2lkdGggKiA4KTsKKwkJCQlwcmludGYgKCJUaGUgd3JpdGUgY29kZSBvbmx5IGhhbmRsZXMgSW50ZWwgMTYtYml0IHdpZGUgZmxhc2ggbWVtb3J5XG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG5vdCBJbnRlbCBmbGFzaCBzbyByZXR1cm4gYW4gZXJyb3IgYXMgYSB3cml0ZSB0aW1lb3V0ICovCisJCQkvKiBOT1RFOiBpZiBpdCdzIGFub3RoZXIgdHlwZSBmbGFzaCwgc3RpY2sgaXRzIHJvdXRpbmUgaGVyZSAqLworCQkJcHJpbnRmICgiRXJyb3I6IFRoZSBmbGFzaCBkZXZpY2UgaXMgbm90IEludGVsIHR5cGVcbiIpOworCQkJcHJpbnRmICgiVGhlIGNvZGUgb25seSBzdXBwb3J0cyBJbnRlbCBmbGFzaCBpbiBhIDMyLWJpdCBwb3J0IHdpZHRoXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogZW5kIG9mIDMyLWJpdCBmbGFzaCBjb2RlICovCisJaWYgKChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1RZUEVNQVNLKSA9PSBGTEFTSF9ST00pCisJCXJldHVybiAxOworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgPT0gRkxBU0hfUkFNKSB7CisJCSoodW5zaWduZWQgbG9uZyAqKSBkZXN0ID0gZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgPT0gRkxBU0hfTUFOX0lOVEVMKSB7CisJCXVuc2lnbmVkIHNob3J0IGxvdyA9IGRhdGEgJiAweGZmZmY7CisJCXVuc2lnbmVkIHNob3J0IGhpID0gKGRhdGEgPj4gMTYpICYgMHhmZmZmOworCQlpbnQgcmV0ID0gd3JpdGVfd29yZF9pbnRlbCAoKGJhbmtfYWRkcl90KSBkZXN0LCBoaSk7CisKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB3cml0ZV93b3JkX2ludGVsICgoYmFua19hZGRyX3QpIChkZXN0ICsgMiksCisJCQkJCQlsb3cpOworCisJCXJldHVybiByZXQ7CisJfQorCisJLyogQ2hlY2sgaWYgRmxhc2ggaXMgKHN1ZmZpY2llbnRseSkgZXJhc2VkICovCisJaWYgKCgqKCh2dV9sb25nICopIGRlc3QpICYgZGF0YSkgIT0gZGF0YSkgeworCQlyZXR1cm4gKDIpOworCX0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0IGhlcmUgKi8KKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOworCisJLyogZmlyc3QsIHBlcmZvcm0gYW4gdW5sb2NrIGJ5cGFzcyBjb21tYW5kIHRvIHNwZWVkIHVwIGZsYXNoIHdyaXRlcyAqLworCWFkZHJbMHg1NTVdID0gMHhBQTsKKwlhZGRyWzB4MkFBXSA9IDB4NTU7CisJYWRkclsweDU1NV0gPSAweDIwOworCisJLyogd3JpdGUgZWFjaCBieXRlIG91dCAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJY2hhciAqZGF0YV9jaCA9IChjaGFyICopICZkYXRhOworCisJCWFkZHJbMF0gPSAweEEwOworCQkqKCgoY2hhciAqKSBkZXN0KSArIGkpID0gZGF0YV9jaFtpXTsKKwkJdWRlbGF5ICgxMCk7CS8qIFhYWCAqLworCX0KKworCS8qIHdlJ3JlIGRvbmUsIG5vdyBkbyBhbiB1bmxvY2sgYnlwYXNzIHJlc2V0ICovCisJYWRkclswXSA9IDB4OTA7CisJYWRkclswXSA9IDB4MDA7CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CisKKwkvKiBkYXRhIHBvbGxpbmcgZm9yIEQ3ICovCisJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCXdoaWxlICgoKigodnVfbG9uZyAqKSBkZXN0KSAmIDB4MDA4MDAwODApICE9IChkYXRhICYgMHgwMDgwMDA4MCkpIHsKKwkJaWYgKGdldF90aW1lciAoc3RhcnQpID4gQ0ZHX0ZMQVNIX1dSSVRFX1RPVVQpIHsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL2kyYy5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZWU1YwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL2kyYy5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhhY2tlZCBmb3IgdGhlIERCNjQzNjAgYm9hcmQgYnkgSW5nby5Bc3NtdXNAa2V5bWlsZS5jb20KKyAqIGV4dHJhIGltcHJvdm1lbnRzIGJ5IEJyYWluIFdhaXRlCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4eHguaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL212X2dlbl9yZWcuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2NvcmUuaCIKKworI2RlZmluZSBNQVhfSTJDX1JFVFJZUwkgICAgMTAKKyNkZWZpbmUgSTJDX0RFTEFZCSAgICAxMDAwCS8qIFNob3VsZCBiZSBhdCBsZWFzdCB0aGUgIyBvZiBNSHogb2YgVGNsayAqLworI3VuZGVmCURFQlVHX0kyQworLyojZGVmaW5lIERFQlVHX0kyQyovCisKKyNpZmRlZiBERUJVR19JMkMKKyNkZWZpbmUgRFAoeCkgeAorI2Vsc2UKKyNkZWZpbmUgRFAoeCkKKyNlbmRpZgorCisvKiBBc3N1bWluZyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIG1hc3RlciBvbiB0aGUgYnVzICh1cykgKi8KKworc3RhdGljIHZvaWQgaTJjX2luaXQgKGludCBzcGVlZCwgaW50IHNsYXZlYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgbiwgbSwgZnJlcSwgbWFyZ2luLCBwb3dlcjsKKwl1bnNpZ25lZCBpbnQgYWN0dWFsTiA9IDAsIGFjdHVhbE0gPSAwOworCXVuc2lnbmVkIGludCBjb250cm9sLCBzdGF0dXM7CisJdW5zaWduZWQgaW50IG1pbk1hcmdpbiA9IDB4ZmZmZmZmZmY7CisJdW5zaWduZWQgaW50IHRjbGsgPSBDRkdfVENMSzsKKwl1bnNpZ25lZCBpbnQgaTJjRnJlcSA9IHNwZWVkOwkvKiAxMDAwMDAgbWF4LiBGYXN0IG1vZGUgbm90IHN1cHBvcnRlZCAqLworCisJRFAgKHB1dHMgKCJpMmNfaW5pdFxuIikpOworLyogZ3RJMmNNYXN0ZXJJbml0ICovCisJZm9yIChuID0gMDsgbiA8IDg7IG4rKykgeworCQlmb3IgKG0gPSAwOyBtIDwgMTY7IG0rKykgeworCQkJcG93ZXIgPSAyIDw8IG47CS8qIHBvd2VyID0gMl4obisxKSAqLworCQkJZnJlcSA9IHRjbGsgLyAoMTAgKiAobSArIDEpICogcG93ZXIpOworCQkJaWYgKGkyY0ZyZXEgPiBmcmVxKQorCQkJCW1hcmdpbiA9IGkyY0ZyZXEgLSBmcmVxOworCQkJZWxzZQorCQkJCW1hcmdpbiA9IGZyZXEgLSBpMmNGcmVxOworCQkJaWYgKG1hcmdpbiA8IG1pbk1hcmdpbikgeworCQkJCW1pbk1hcmdpbiA9IG1hcmdpbjsKKwkJCQlhY3R1YWxOID0gbjsKKwkJCQlhY3R1YWxNID0gbTsKKwkJCX0KKwkJfQorCX0KKworCURQIChwdXRzICgic2V0dXAgaTJjIGJ1c1xuIikpOworCisJLyogU2V0dXAgYnVzICovCisvKiBndEkyY1Jlc2V0ICovCisJR1RfUkVHX1dSSVRFIChJMkNfU09GVF9SRVNFVCwgMCk7CisKKwlEUCAocHV0cyAoInVkZWxheS4uLlxuIikpOworCisJdWRlbGF5IChJMkNfREVMQVkpOworCisJRFAgKHB1dHMgKCJzZXQgYmF1ZHJhdGVcbiIpKTsKKworCUdUX1JFR19XUklURSAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAoYWN0dWFsTSA8PCAzKSB8IGFjdHVhbE4pOworCUdUX1JFR19XUklURSAoSTJDX0NPTlRST0wsICgweDEgPDwgMikgfCAoMHgxIDw8IDYpKTsKKworCXVkZWxheSAoSTJDX0RFTEFZICogMTApOworCisJRFAgKHB1dHMgKCJyZWFkIGNvbnRyb2wsIGJhdWRyYXRlXG4iKSk7CisKKwlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKwlHVF9SRUdfUkVBRCAoSTJDX0NPTlRST0wsICZjb250cm9sKTsKK30KKworc3RhdGljIHVjaGFyIGkyY19zdGFydCAodm9pZCkKK3sJCQkJLyogREI2NDM2MCBjaGVja2VkIC0+IG9rICovCisJdW5zaWduZWQgaW50IGNvbnRyb2wsIHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJRFAgKHB1dHMgKCJpMmNfc3RhcnRcbiIpKTsKKworCS8qIFNldCB0aGUgc3RhcnQgYml0ICovCisKKy8qIGd0STJjR2VuZXJhdGVTdGFydEJpdCgpICovCisKKwlHVF9SRUdfUkVBRCAoSTJDX0NPTlRST0wsICZjb250cm9sKTsKKwljb250cm9sIHw9ICgweDEgPDwgNSk7CS8qIGdlbmVyYXRlIHRoZSBJMkNfU1RBUlRfQklUICovCisJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgY29udHJvbCk7CisKKwlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoKHN0YXR1cyAmIDB4ZmYpICE9IDB4MDgpIHsKKwkJdWRlbGF5IChJMkNfREVMQVkpOworCQlpZiAoY291bnQgPiAyMCkgeworCQkJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgKDB4MSA8PCA0KSk7CS8qc3RvcCAqLworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJCUdUX1JFR19SRUFEIChJMkNfU1RBVFVTX0JBVURFX1JBVEUsICZzdGF0dXMpOworCQljb3VudCsrOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB1Y2hhciBpMmNfc2VsZWN0X2RldmljZSAodWNoYXIgZGV2X2FkZHIsIHVjaGFyIHJlYWQsIGludCB0ZW5fYml0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXMsIGRhdGEsIGJpdHMgPSA3OworCWludCBjb3VudCA9IDA7CisKKwlEUCAocHV0cyAoImkyY19zZWxlY3RfZGV2aWNlXG4iKSk7CisKKwkvKiBPdXRwdXQgc2xhdmUgYWRkcmVzcyAqLworCisJaWYgKHRlbl9iaXQpIHsKKwkJYml0cyA9IDEwOworCX0KKworCWRhdGEgPSAoZGV2X2FkZHIgPDwgMSk7CisJLyogc2V0IHRoZSByZWFkIGJpdCAqLworCWRhdGEgfD0gcmVhZDsKKwlHVF9SRUdfV1JJVEUgKEkyQ19EQVRBLCBkYXRhKTsKKwkvKiBhc3NlcnQgdGhlIGFkZHJlc3MgKi8KKwlSRVNFVF9SRUdfQklUUyAoSTJDX0NPTlRST0wsIEJJVDMpOworCisJdWRlbGF5IChJMkNfREVMQVkpOworCisJR1RfUkVHX1JFQUQgKEkyQ19TVEFUVVNfQkFVREVfUkFURSwgJnN0YXR1cyk7CisJY291bnQgPSAwOworCXdoaWxlICgoKHN0YXR1cyAmIDB4ZmYpICE9IDB4NDApICYmICgoc3RhdHVzICYgMHhmZikgIT0gMHgxOCkpIHsKKwkJdWRlbGF5IChJMkNfREVMQVkpOworCQlpZiAoY291bnQgPiAyMCkgeworCQkJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgKDB4MSA8PCA0KSk7CS8qc3RvcCAqLworCQkJcmV0dXJuIChzdGF0dXMpOworCQl9CisJCUdUX1JFR19SRUFEIChJMkNfU1RBVFVTX0JBVURFX1JBVEUsICZzdGF0dXMpOworCQljb3VudCsrOworCX0KKworCWlmIChiaXRzID09IDEwKSB7CisJCXByaW50ZiAoIjEwIGJpdCBJMkMgYWRkcmVzc2luZyBub3QgeWV0IGltcGxlbWVudGVkXG4iKTsKKwkJcmV0dXJuICgweGZmKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdWNoYXIgaTJjX2dldF9kYXRhICh1Y2hhciAqIHJldHVybl9kYXRhLCBpbnQgbGVuKQoreworCisJdW5zaWduZWQgaW50IGRhdGEsIHN0YXR1czsKKwlpbnQgY291bnQgPSAwOworCisJRFAgKHB1dHMgKCJpMmNfZ2V0X2RhdGFcbiIpKTsKKworCXdoaWxlIChsZW4pIHsKKworCQkvKiBHZXQgYW5kIHJldHVybiB0aGUgZGF0YSAqLworCisJCVJFU0VUX1JFR19CSVRTIChJMkNfQ09OVFJPTCwgKDB4MSA8PCAzKSk7CisKKwkJdWRlbGF5IChJMkNfREVMQVkgKiA1KTsKKworCQlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKwkJY291bnQrKzsKKwkJd2hpbGUgKChzdGF0dXMgJiAweGZmKSAhPSAweDUwKSB7CisJCQl1ZGVsYXkgKEkyQ19ERUxBWSk7CisJCQlpZiAoY291bnQgPiAyKSB7CisJCQkJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgKDB4MSA8PCA0KSk7CS8qc3RvcCAqLworCQkJCXJldHVybiAwOworCQkJfQorCQkJR1RfUkVHX1JFQUQgKEkyQ19TVEFUVVNfQkFVREVfUkFURSwgJnN0YXR1cyk7CisJCQljb3VudCsrOworCQl9CisJCUdUX1JFR19SRUFEIChJMkNfREFUQSwgJmRhdGEpOworCQlsZW4tLTsKKwkJKnJldHVybl9kYXRhID0gKHVjaGFyKSBkYXRhOworCQlyZXR1cm5fZGF0YSsrOworCX0KKwlSRVNFVF9SRUdfQklUUyAoSTJDX0NPTlRST0wsIEJJVDIgfCBCSVQzKTsKKwl3aGlsZSAoKHN0YXR1cyAmIDB4ZmYpICE9IDB4NTgpIHsKKwkJdWRlbGF5IChJMkNfREVMQVkpOworCQlpZiAoY291bnQgPiAyMDApIHsKKwkJCUdUX1JFR19XUklURSAoSTJDX0NPTlRST0wsICgweDEgPDwgNCkpOwkvKnN0b3AgKi8KKwkJCXJldHVybiAoc3RhdHVzKTsKKwkJfQorCQlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKwkJY291bnQrKzsKKwl9CisJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgKDB4MSA8PCA0KSk7CS8qIHN0b3AgKi8KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB1Y2hhciBpMmNfd3JpdGVfZGF0YSAodW5zaWduZWQgaW50ICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwl1bnNpZ25lZCBpbnQgKnRlbXBfcHRyID0gZGF0YTsKKworCURQIChwdXRzICgiaTJjX3dyaXRlX2RhdGFcbiIpKTsKKworCXdoaWxlIChsZW4pIHsKKwkJdGVtcCA9ICh1bnNpZ25lZCBpbnQpICgqdGVtcF9wdHIpOworCQlHVF9SRUdfV1JJVEUgKEkyQ19EQVRBLCB0ZW1wKTsKKwkJUkVTRVRfUkVHX0JJVFMgKEkyQ19DT05UUk9MLCAoMHgxIDw8IDMpKTsKKworCQl1ZGVsYXkgKEkyQ19ERUxBWSk7CisKKwkJR1RfUkVHX1JFQUQgKEkyQ19TVEFUVVNfQkFVREVfUkFURSwgJnN0YXR1cyk7CisJCWNvdW50Kys7CisJCXdoaWxlICgoc3RhdHVzICYgMHhmZikgIT0gMHgyOCkgeworCQkJdWRlbGF5IChJMkNfREVMQVkpOworCQkJaWYgKGNvdW50ID4gMjApIHsKKwkJCQlHVF9SRUdfV1JJVEUgKEkyQ19DT05UUk9MLCAoMHgxIDw8IDQpKTsJLypzdG9wICovCisJCQkJcmV0dXJuIChzdGF0dXMpOworCQkJfQorCQkJR1RfUkVHX1JFQUQgKEkyQ19TVEFUVVNfQkFVREVfUkFURSwgJnN0YXR1cyk7CisJCQljb3VudCsrOworCQl9CisJCWxlbi0tOworCQl0ZW1wX3B0cisrOworCX0KKy8qIDExLTE0LTIwMDIgUGF1bCBNYXJjaGVzZSAqLworLyogQ2FuJ3QgaGF2ZSB0aGUgd3JpdGUgaXNzdWluZyBhIHN0b3AgY29tbWFuZCAqLworLyogaXQncyB3cm9uZyB0byBoYXZlIGEgc3RvcCBiaXQgaW4gcmVhZCBzdHJlYW0gb3Igd3JpdGUgc3RyZWFtICovCisvKiBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIGl0J3MgcmVhbGx5IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKi8KKy8qIG9yIHdoZXRoZXIgd2UgaGF2ZSBqdXN0IHNlbmQgdGhlIGRldmljZSBhZGRyZXNzICsgb2Zmc2V0ICovCisvKiB3ZSB3aWxsIHB1c2ggaXNzdWluZyB0aGUgc3RvcCBjb21tYW5kIG9mZiB0byB0aGUgb3JpZ2luYWwgKi8KKy8qIGNhbGxpbmcgZnVuY3Rpb24gKi8KKwkvKiBzZXQgdGhlIGludGVycnVwdCBiaXQgaW4gdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKEkyQ19DT05UUk9MLCAoMHgxIDw8IDMpKTsKKwl1ZGVsYXkgKEkyQ19ERUxBWSAqIDEwKTsKKwlyZXR1cm4gKDApOworfQorCisvKiAxMS0xNC0yMDAyIFBhdWwgTWFyY2hlc2UgKi8KKy8qIGNyZWF0ZWQgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGkyY193cml0ZSgpICovCisvKiBmdW5jdGlvbiB3b3JraW5nIHByb3Blcmx5LiAqLworLyogZnVuY3Rpb24gdG8gd3JpdGUgYnl0ZXMgb3V0IG9uIHRoZSBpMmMgYnVzICovCisvKiB0aGlzIGlzIGlkZW50aWNhbCB0byB0aGUgZnVuY3Rpb24gaTJjX3dyaXRlX2RhdGEoKSAqLworLyogZXhjZXB0IHRoYXQgaXQgcmVxdWlyZXMgYSBidWZmZXIgdGhhdCBpcyBhbiAqLworLyogdW5zaWduZWQgY2hhcmFjdGVyIGFycmF5LiAgWW91IGNhbid0IHVzZSAqLworLyogaTJjX3dyaXRlX2RhdGEoKSB0byBzZW5kIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXJhY3RlcnMgKi8KKy8qIHNpbmNlIHRoZSBieXRlIG9mIGludGVyZXN0IGVuZHMgdXAgb24gdGhlIHdyb25nIGVuZCBvZiB0aGUgYnVzICovCisvKiBhYWgsIHRoZSBqb3lzIG9mIGJpZyBlbmRpYW4gdmVyc3VzIGxpdHRsZSBlbmRpYW4hICovCisvKiAqLworLyogcmV0dXJucyAwID0gc3VjY2VzcyAqLworLyogICAgICAgICBhbnl0aGluZyBvdGhlciB0aGFuIHplcm8gaXMgZmFpbHVyZSAqLworc3RhdGljIHVjaGFyIGkyY193cml0ZV9ieXRlICh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwl1bnNpZ25lZCBjaGFyICp0ZW1wX3B0ciA9IGRhdGE7CisKKwlEUCAocHV0cyAoImkyY193cml0ZV9ieXRlXG4iKSk7CisKKwl3aGlsZSAobGVuKSB7CisJCS8qIFNldCBhbmQgYXNzZXJ0IHRoZSBkYXRhICovCisJCXRlbXAgPSAqdGVtcF9wdHI7CisJCUdUX1JFR19XUklURSAoSTJDX0RBVEEsIHRlbXApOworCQlSRVNFVF9SRUdfQklUUyAoSTJDX0NPTlRST0wsICgweDEgPDwgMykpOworCisJCXVkZWxheSAoSTJDX0RFTEFZKTsKKworCQlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKwkJY291bnQrKzsKKwkJd2hpbGUgKChzdGF0dXMgJiAweGZmKSAhPSAweDI4KSB7CisJCQl1ZGVsYXkgKEkyQ19ERUxBWSk7CisJCQlpZiAoY291bnQgPiAyMCkgeworCQkJCUdUX1JFR19XUklURSAoSTJDX0NPTlRST0wsICgweDEgPDwgNCkpOwkvKnN0b3AgKi8KKwkJCQlyZXR1cm4gKHN0YXR1cyk7CisJCQl9CisJCQlHVF9SRUdfUkVBRCAoSTJDX1NUQVRVU19CQVVERV9SQVRFLCAmc3RhdHVzKTsKKwkJCWNvdW50Kys7CisJCX0KKwkJbGVuLS07CisJCXRlbXBfcHRyKys7CisJfQorLyogQ2FuJ3QgaGF2ZSB0aGUgd3JpdGUgaXNzdWluZyBhIHN0b3AgY29tbWFuZCAqLworLyogaXQncyB3cm9uZyB0byBoYXZlIGEgc3RvcCBiaXQgaW4gcmVhZCBzdHJlYW0gb3Igd3JpdGUgc3RyZWFtICovCisvKiBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIGl0J3MgcmVhbGx5IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgKi8KKy8qIG9yIHdoZXRoZXIgd2UgaGF2ZSBqdXN0IHNlbmQgdGhlIGRldmljZSBhZGRyZXNzICsgb2Zmc2V0ICovCisvKiB3ZSB3aWxsIHB1c2ggaXNzdWluZyB0aGUgc3RvcCBjb21tYW5kIG9mZiB0byB0aGUgb3JpZ2luYWwgKi8KKy8qIGNhbGxpbmcgZnVuY3Rpb24gKi8KKy8qCUdUX1JFR19XUklURShJMkNfQ09OVFJPTCwgKDB4MSA8PCAzKSB8ICgweDEgPDwgNCkpOworCUdUX1JFR19XUklURShJMkNfQ09OVFJPTCwgKDB4MSA8PCA0KSk7ICovCisJLyogc2V0IHRoZSBpbnRlcnJ1cHQgYml0IGluIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisJR1RfUkVHX1dSSVRFIChJMkNfQ09OVFJPTCwgKDB4MSA8PCAzKSk7CisJdWRlbGF5IChJMkNfREVMQVkgKiAxMCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdWNoYXIKK2kyY19zZXRfZGV2X29mZnNldCAodWNoYXIgZGV2X2FkZHIsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB0ZW5fYml0LAorCQkgICAgaW50IGFsZW4pCit7CisJdWNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCB0YWJsZVsyXTsKKworLyogaW5pdGlhbGl6ZSB0aGUgdGFibGUgb2YgYWRkcmVzcyBvZmZzZXQgYnl0ZXMgKi8KKy8qIHV0aWxpemVkIGZvciAyIGJ5dGUgYWRkcmVzcyBvZmZzZXRzICovCisvKiBOT1RFOiB0aGUgb3JkZXIgaXMgaGlnaCBieXRlIGZpcnN0ISAqLworCXRhYmxlWzFdID0gb2Zmc2V0ICYgMHhmZjsJLyogbG93IGJ5dGUgKi8KKwl0YWJsZVswXSA9IG9mZnNldCAvIDB4MTAwOwkvKiBoaWdoIGJ5dGUgKi8KKworCURQIChwdXRzICgiaTJjX3NldF9kZXZfb2Zmc2V0XG4iKSk7CisKKwlzdGF0dXMgPSBpMmNfc2VsZWN0X2RldmljZSAoZGV2X2FkZHIsIDAsIHRlbl9iaXQpOworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiRmFpbGVkIHRvIHNlbGVjdCBkZXZpY2Ugc2V0dGluZyBvZmZzZXQ6IDB4JTAyeFxuIiwKKwkJCXN0YXR1cyk7CisjZW5kaWYKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisvKiBjaGVjayB0aGUgYWRkcmVzcyBvZmZzZXQgbGVuZ3RoICovCisJaWYgKGFsZW4gPT0gMCkKKwkJLyogbm8gYWRkcmVzcyBvZmZzZXQgKi8KKwkJcmV0dXJuICgwKTsKKwllbHNlIGlmIChhbGVuID09IDEpIHsKKwkJLyogMSBieXRlIGFkZHJlc3Mgb2Zmc2V0ICovCisJCXN0YXR1cyA9IGkyY193cml0ZV9kYXRhICgmb2Zmc2V0LCAxKTsKKwkJaWYgKHN0YXR1cykgeworI2lmZGVmIERFQlVHX0kyQworCQkJcHJpbnRmICgiRmFpbGVkIHRvIHdyaXRlIGRhdGE6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0gZWxzZSBpZiAoYWxlbiA9PSAyKSB7CisJCS8qIDIgYnl0ZXMgYWRkcmVzcyBvZmZzZXQgKi8KKwkJc3RhdHVzID0gaTJjX3dyaXRlX2RhdGEgKHRhYmxlLCAyKTsKKwkJaWYgKHN0YXR1cykgeworI2lmZGVmIERFQlVHX0kyQworCQkJcHJpbnRmICgiRmFpbGVkIHRvIHdyaXRlIGRhdGE6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGFkZHJlc3Mgb2Zmc2V0IHVua25vd24gb3Igbm90IHN1cHBvcnRlZCAqLworCQlwcmludGYgKCJBZGRyZXNzIGxlbmd0aCBvZmZzZXQgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgYWxlbik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsJCS8qIHN1Y2Vzc2Z1bCBjb21wbGV0aW9uICovCit9CisKK3VjaGFyCitpMmNfcmVhZCAodWNoYXIgZGV2X2FkZHIsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCBhbGVuLCB1Y2hhciAqIGRhdGEsCisJICBpbnQgbGVuKQoreworCXVjaGFyIHN0YXR1cyA9IDA7CisJdW5zaWduZWQgaW50IGkyY0ZyZXEgPSBDRkdfSTJDX1NQRUVEOworCisJRFAgKHB1dHMgKCJpMmNfcmVhZFxuIikpOworCisJaTJjX2luaXQgKGkyY0ZyZXEsIDApOwkvKiBzZXQgdGhlIGkyYyBmcmVxdWVuY3kgKi8KKworCXN0YXR1cyA9IGkyY19zdGFydCAoKTsKKworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiVHJhbnNhY3Rpb24gc3RhcnQgZmFpbGVkOiAweCUwMnhcbiIsIHN0YXR1cyk7CisjZW5kaWYKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBpMmNfc2V0X2Rldl9vZmZzZXQgKGRldl9hZGRyLCBvZmZzZXQsIDAsIGFsZW4pOwkvKiBzZW5kIHRoZSBzbGF2ZSBhZGRyZXNzICsgb2Zmc2V0ICovCisJaWYgKHN0YXR1cykgeworI2lmZGVmIERFQlVHX0kyQworCQlwcmludGYgKCJGYWlsZWQgdG8gc2V0IHNsYXZlIGFkZHJlc3MgJiBvZmZzZXQ6IDB4JTAyeFxuIiwKKwkJCXN0YXR1cyk7CisjZW5kaWYKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpMmNfaW5pdCAoaTJjRnJlcSwgMCk7CS8qIHNldCB0aGUgaTJjIGZyZXF1ZW5jeSBhZ2FpbiAqLworCisJc3RhdHVzID0gaTJjX3N0YXJ0ICgpOworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiVHJhbnNhY3Rpb24gcmVzdGFydCBmYWlsZWQ6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGkyY19zZWxlY3RfZGV2aWNlIChkZXZfYWRkciwgMSwgMCk7CS8qIHNlbmQgdGhlIHNsYXZlIGFkZHJlc3MgKi8KKwlpZiAoc3RhdHVzKSB7CisjaWZkZWYgREVCVUdfSTJDCisJCXByaW50ZiAoIkFkZHJlc3Mgbm90IGFja25vd2xlZGdlZDogMHglMDJ4XG4iLCBzdGF0dXMpOworI2VuZGlmCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gaTJjX2dldF9kYXRhIChkYXRhLCBsZW4pOworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiRGF0YSBub3QgcmVjaWV2ZWQ6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfQorCisvKiAxMS0xNC0yMDAyIFBhdWwgTWFyY2hlc2UgKi8KKy8qIEZ1bmN0aW9uIHRvIHNldCB0aGUgSTJDIHN0b3AgYml0ICovCit2b2lkIGkyY19zdG9wICh2b2lkKQoreworCUdUX1JFR19XUklURSAoSTJDX0NPTlRST0wsICgweDEgPDwgNCkpOworfQorCisvKiAxMS0xNC0yMDAyIFBhdWwgTWFyY2hlc2UgKi8KKy8qIEkyQyB3cml0ZSBmdW5jdGlvbiAqLworLyogZGV2X2FkZHIgPSBkZXZpY2UgYWRkcmVzcyAqLworLyogb2Zmc2V0ID0gYWRkcmVzcyBvZmZzZXQgKi8KKy8qIGFsZW4gPSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGFkZHJlc3Mgb2Zmc2V0ICovCisvKiBkYXRhID0gcG9pbnRlciB0byBidWZmZXIgdG8gcmVhZCBkYXRhIGludG8gKi8KKy8qIGxlbiA9ICMgb2YgYnl0ZXMgdG8gcmVhZCAqLworLyogKi8KKy8qIHJldHVybnMgMCA9IHN1Y2Nlc2Z1bCAqLworLyogICAgICAgICBhbnl0aGluZyBidXQgemVybyBpcyBmYWlsdXJlICovCit1Y2hhcgoraTJjX3dyaXRlICh1Y2hhciBkZXZfYWRkciwgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IGFsZW4sIHVjaGFyICogZGF0YSwKKwkgICBpbnQgbGVuKQoreworCXVjaGFyIHN0YXR1cyA9IDA7CisJdW5zaWduZWQgaW50IGkyY0ZyZXEgPSBDRkdfSTJDX1NQRUVEOworCisJRFAgKHB1dHMgKCJpMmNfd3JpdGVcbiIpKTsKKworCWkyY19pbml0IChpMmNGcmVxLCAwKTsJLyogc2V0IHRoZSBpMmMgZnJlcXVlbmN5ICovCisKKwlzdGF0dXMgPSBpMmNfc3RhcnQgKCk7CS8qIHNlbmQgYSBzdGFydCBiaXQgKi8KKworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiVHJhbnNhY3Rpb24gc3RhcnQgZmFpbGVkOiAweCUwMnhcbiIsIHN0YXR1cyk7CisjZW5kaWYKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBpMmNfc2V0X2Rldl9vZmZzZXQgKGRldl9hZGRyLCBvZmZzZXQsIDAsIGFsZW4pOwkvKiBzZW5kIHRoZSBzbGF2ZSBhZGRyZXNzICsgb2Zmc2V0ICovCisJaWYgKHN0YXR1cykgeworI2lmZGVmIERFQlVHX0kyQworCQlwcmludGYgKCJGYWlsZWQgdG8gc2V0IHNsYXZlIGFkZHJlc3MgJiBvZmZzZXQ6IDB4JTAyeFxuIiwKKwkJCXN0YXR1cyk7CisjZW5kaWYKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKworCXN0YXR1cyA9IGkyY193cml0ZV9ieXRlIChkYXRhLCBsZW4pOwkvKiB3cml0ZSB0aGUgZGF0YSAqLworCWlmIChzdGF0dXMpIHsKKyNpZmRlZiBERUJVR19JMkMKKwkJcHJpbnRmICgiRGF0YSBub3Qgd3JpdHRlbjogMHglMDJ4XG4iLCBzdGF0dXMpOworI2VuZGlmCisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIGlzc3VlIGEgc3RvcCBiaXQgKi8KKwlpMmNfc3RvcCAoKTsKKwlyZXR1cm4gMDsKK30KKworLyogMTEtMTQtMjAwMiBQYXVsIE1hcmNoZXNlICovCisvKiBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYW4gSTJDIGRldmljZSBpcyBwcmVzZW50ICovCisvKiBjaGlwID0gZGV2aWNlIGFkZHJlc3Mgb2YgY2hpcCB0byBjaGVjayBmb3IgKi8KKy8qICovCisvKiByZXR1cm5zIDAgPSBzdWNlc3NmdWwsIHRoZSBkZXZpY2UgZXhpc3RzICovCisvKiAgICAgICAgIGFueXRoaW5nIG90aGVyIHRoYW4gemVybyBpcyBmYWlsdXJlLCBubyBkZXZpY2UgKi8KK2ludCBpMmNfcHJvYmUgKHVjaGFyIGNoaXApCit7CisKKwkvKiBXZSBhcmUganVzdCBsb29raW5nIGZvciBhbiA8QUNLPiBiYWNrLiAqLworCS8qIFRvIHNlZSBpZiB0aGUgZGV2aWNlL2NoaXAgaXMgdGhlcmUgKi8KKworI2lmZGVmIERFQlVHX0kyQworCXVuc2lnbmVkIGludCBpMmNfc3RhdHVzOworI2VuZGlmCisJdWNoYXIgc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBpbnQgaTJjRnJlcSA9IENGR19JMkNfU1BFRUQ7CisKKwlEUCAocHV0cyAoImkyY19wcm9iZVxuIikpOworCisJaTJjX2luaXQgKGkyY0ZyZXEsIDApOwkvKiBzZXQgdGhlIGkyYyBmcmVxdWVuY3kgKi8KKworCXN0YXR1cyA9IGkyY19zdGFydCAoKTsJLyogc2VuZCBhIHN0YXJ0IGJpdCAqLworCisJaWYgKHN0YXR1cykgeworI2lmZGVmIERFQlVHX0kyQworCQlwcmludGYgKCJUcmFuc2FjdGlvbiBzdGFydCBmYWlsZWQ6IDB4JTAyeFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gKGludCkgc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGkyY19zZXRfZGV2X29mZnNldCAoY2hpcCwgMCwgMCwgMCk7CS8qIHNlbmQgdGhlIHNsYXZlIGFkZHJlc3MgKyBubyBvZmZzZXQgKi8KKwlpZiAoc3RhdHVzKSB7CisjaWZkZWYgREVCVUdfSTJDCisJCXByaW50ZiAoIkZhaWxlZCB0byBzZXQgc2xhdmUgYWRkcmVzczogMHglMDJ4XG4iLCBzdGF0dXMpOworI2VuZGlmCisJCXJldHVybiAoaW50KSBzdGF0dXM7CisJfQorI2lmZGVmIERFQlVHX0kyQworCUdUX1JFR19SRUFEIChJMkNfU1RBVFVTX0JBVURFX1JBVEUsICZpMmNfc3RhdHVzKTsKKwlwcmludGYgKCJhZGRyZXNzICUjeCByZXR1cm5lZCAlI3hcbiIsIGNoaXAsIGkyY19zdGF0dXMpOworI2VuZGlmCisJLyogaXNzdWUgYSBzdG9wIGJpdCAqLworCWkyY19zdG9wICgpOworCXJldHVybiAwOwkJLyogc3VjY2Vzc2Z1bCBjb21wbGV0aW9uICovCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9pMmMuaCBiL2JvYXJkL01hcnZlbGwvY29tbW9uL2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjlmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9pMmMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhhY2tlZCBmb3IgdGhlIERCNjQzNjAgYm9hcmQgYnkgSW5nby5Bc3NtdXNAa2V5bWlsZS5jb20KKyAqLworCisjaWZuZGVmIF9fSTJDX0hfXworI2RlZmluZSBfX0kyQ19IX18KKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCit1Y2hhciBpMmNfcmVhZCh1Y2hhciwgdW5zaWduZWQgaW50LCBpbnQsIHVjaGFyKiwgaW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9pbnRlbF9mbGFzaC5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vaW50ZWxfZmxhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjZmODgzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9jb21tb24vaW50ZWxfZmxhc2guYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIYWNrZWQgZm9yIHRoZSBtYXJ2ZWxsIGRiNjQzNjAgZXZhbCBib2FyZCBieQorICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4eHguaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL212X2dlbl9yZWcuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21lbW9yeS5oIgorI2luY2x1ZGUgImludGVsX2ZsYXNoLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHJvdGVjdGlvbiBGbGFnczoKKyAqLworI2RlZmluZSBGTEFHX1BST1RFQ1RfU0VUCTB4MDEKKyNkZWZpbmUgRkxBR19QUk9URUNUX0NMRUFSCTB4MDIKKworc3RhdGljIHZvaWQgYmFua19yZXNldCAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNlY3QpCit7CisJYmFua19hZGRyX3QgYWRkcncsIGVhZGRydzsKKworCWFkZHJ3ID0gKGJhbmtfYWRkcl90KSBpbmZvLT5zdGFydFtzZWN0XTsKKwllYWRkcncgPSBCQU5LX0FERFJfTkVYVF9XT1JEIChhZGRydyk7CisKKwl3aGlsZSAoYWRkcncgPCBlYWRkcncpIHsKKyNpZmRlZiBGTEFTSF9ERUJVRworCQlwcmludGYgKCIgIHdyaXRpbmcgcmVzZXQgY21kIHRvIGFkZHIgMHglMDhseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSBhZGRydyk7CisjZW5kaWYKKwkJKmFkZHJ3ID0gQkFOS19DTURfUlNUOworCQlhZGRydysrOworCX0KK30KKworc3RhdGljIHZvaWQgYmFua19lcmFzZV9pbml0IChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc2VjdCkKK3sKKwliYW5rX2FkZHJfdCBhZGRydywgc2FkZHJ3LCBlYWRkcnc7CisJaW50IGZsYWc7CisKKyNpZmRlZiBGTEFTSF9ERUJVRworCXByaW50ZiAoIjB4JTA4eCBCQU5LX0NNRF9QUk9HXG4iLCBCQU5LX0NNRF9QUk9HKTsKKwlwcmludGYgKCIweCUwOHggQkFOS19DTURfRVJBU0UxXG4iLCBCQU5LX0NNRF9FUkFTRTEpOworCXByaW50ZiAoIjB4JTA4eCBCQU5LX0NNRF9FUkFTRTJcbiIsIEJBTktfQ01EX0VSQVNFMik7CisJcHJpbnRmICgiMHglMDh4IEJBTktfQ01EX0NMUl9TVEFUXG4iLCBCQU5LX0NNRF9DTFJfU1RBVCk7CisJcHJpbnRmICgiMHglMDh4IEJBTktfQ01EX1JTVFxuIiwgQkFOS19DTURfUlNUKTsKKwlwcmludGYgKCIweCUwOHggQkFOS19TVEFUX1JEWVxuIiwgQkFOS19TVEFUX1JEWSk7CisJcHJpbnRmICgiMHglMDh4IEJBTktfU1RBVF9FUlJcbiIsIEJBTktfU1RBVF9FUlIpOworI2VuZGlmCisKKwlzYWRkcncgPSAoYmFua19hZGRyX3QpIGluZm8tPnN0YXJ0W3NlY3RdOworCWVhZGRydyA9IEJBTktfQUREUl9ORVhUX1dPUkQgKHNhZGRydyk7CisKKyNpZmRlZiBGTEFTSF9ERUJVRworCXByaW50ZiAoImVyYXNpbmcgc2VjdG9yICVkLCBzdGFydCBhZGRyID0gMHglMDhseCAiCisJCSIoYmFuayBuZXh0IHdvcmQgYWRkciA9IDB4JTA4bHgpXG4iLCBzZWN0LAorCQkodW5zaWduZWQgbG9uZykgc2FkZHJ3LCAodW5zaWduZWQgbG9uZykgZWFkZHJ3KTsKKyNlbmRpZgorCisJLyogRGlzYWJsZSBpbnRycyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwlmb3IgKGFkZHJ3ID0gc2FkZHJ3OyBhZGRydyA8IGVhZGRydzsgYWRkcncrKykgeworI2lmZGVmIEZMQVNIX0RFQlVHCisJCXByaW50ZiAoIiAgd3JpdGluZyBlcmFzZSBjbWQgdG8gYWRkciAweCUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIGFkZHJ3KTsKKyNlbmRpZgorCQkqYWRkcncgPSBCQU5LX0NNRF9FUkFTRTE7CisJCSphZGRydyA9IEJBTktfQ01EX0VSQVNFMjsKKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoZmxhZykKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisKK3N0YXRpYyBpbnQgYmFua19lcmFzZV9wb2xsIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc2VjdCkKK3sKKwliYW5rX2FkZHJfdCBhZGRydywgc2FkZHJ3LCBlYWRkcnc7CisJaW50IHNlY3Rkb25lLCBoYWRlcnI7CisKKwlzYWRkcncgPSAoYmFua19hZGRyX3QpIGluZm8tPnN0YXJ0W3NlY3RdOworCWVhZGRydyA9IEJBTktfQUREUl9ORVhUX1dPUkQgKHNhZGRydyk7CisKKwlzZWN0ZG9uZSA9IDE7CisJaGFkZXJyID0gMDsKKworCWZvciAoYWRkcncgPSBzYWRkcnc7IGFkZHJ3IDwgZWFkZHJ3OyBhZGRydysrKSB7CisJCWJhbmtfd29yZF90IHN0YXQgPSAqYWRkcnc7CisKKyNpZmRlZiBGTEFTSF9ERUJVRworCQlwcmludGYgKCIgIGNoZWNraW5nIHN0YXR1cyBhdCBhZGRyICIKKwkJCSIweCUwOHggWzB4JTA4eF1cbiIsICh1bnNpZ25lZCBsb25nKSBhZGRydywgc3RhdCk7CisjZW5kaWYKKwkJaWYgKChzdGF0ICYgQkFOS19TVEFUX1JEWSkgIT0gQkFOS19TVEFUX1JEWSkKKwkJCXNlY3Rkb25lID0gMDsKKwkJZWxzZSBpZiAoKHN0YXQgJiBCQU5LX1NUQVRfRVJSKSAhPSAwKSB7CisJCQlwcmludGYgKCIgZmFpbGVkIG9uIHNlY3RvciAlZCAiCisJCQkJIihzdGF0ID0gMHglMDh4KSBhdCAiCisJCQkJImFkZHJlc3MgMHglcFxuIiwgc2VjdCwgc3RhdCwgYWRkcncpOworCQkJKmFkZHJ3ID0gQkFOS19DTURfQ0xSX1NUQVQ7CisJCQloYWRlcnIgPSAxOworCQl9CisJfQorCisJaWYgKGhhZGVycikKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKHNlY3Rkb25lKTsKK30KKworaW50IHdyaXRlX3dvcmRfaW50ZWwgKGJhbmtfYWRkcl90IGFkZHIsIGJhbmtfd29yZF90IHZhbHVlKQoreworCWJhbmtfd29yZF90IHN0YXQ7CisJdWxvbmcgc3RhcnQ7CisJaW50IGZsYWcsIHJldHZhbDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLworCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwkqYWRkciA9IEJBTktfQ01EX1BST0c7CisKKwkqYWRkciA9IHZhbHVlOworCisJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGZsYWcpCisJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworCisJcmV0dmFsID0gMDsKKworCS8qIGRhdGEgcG9sbGluZyBmb3IgRDcgKi8KKwlzdGFydCA9IGdldF90aW1lciAoMCk7CisJZG8geworCQlpZiAoZ2V0X3RpbWVyIChzdGFydCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJcmV0dmFsID0gMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzdGF0ID0gKmFkZHI7CisJfSB3aGlsZSAoKHN0YXQgJiBCQU5LX1NUQVRfUkRZKSAhPSBCQU5LX1NUQVRfUkRZKTsKKworCWlmICgoc3RhdCAmIEJBTktfU1RBVF9FUlIpICE9IDApIHsKKwkJcHJpbnRmICgiZmxhc2ggcHJvZ3JhbSBmYWlsZWQgKHN0YXQgPSAweCUwOGx4KSAiCisJCQkiYXQgYWRkcmVzcyAweCUwOGx4XG4iLCAodWxvbmcpIHN0YXQsICh1bG9uZykgYWRkcik7CisJCSphZGRyID0gQkFOS19DTURfQ0xSX1NUQVQ7CisJCXJldHZhbCA9IDM7CisJfQorCisgICAgICBkb25lOgorCS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCSphZGRyID0gQkFOS19DTURfUlNUOworCisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW50IGZsYXNoX2VyYXNlX2ludGVsIChmbGFzaF9pbmZvX3QgKiBpbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK3sKKwlpbnQgcHJvdCwgc2VjdCwgaGFkZXJyOworCXVsb25nIHN0YXJ0LCBub3csIGxhc3Q7CisKKyNpZmRlZiBGTEFTSF9ERUJVRworCXByaW50ZiAoIlxuZmxhc2hfZXJhc2U6IGVyYXNlICVkIHNlY3RvcnMgKCVkIHRvICVkIGluY2wuKSBmcm9tXG4iCisJCSIgIEJhbmsgIyAlZDogIiwgc19sYXN0IC0gc19maXJzdCArIDEsIHNfZmlyc3QsIHNfbGFzdCwKKwkJKGluZm8gLSBmbGFzaF9pbmZvKSArIDEpOworCWZsYXNoX3ByaW50X2luZm8gKGluZm8pOworI2VuZGlmCisKKwlpZiAoKHNfZmlyc3QgPCAwKSB8fCAoc19maXJzdCA+IHNfbGFzdCkpIHsKKwkJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKKwkJCXByaW50ZiAoIi0gbWlzc2luZ1xuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGYgKCItIG5vIHNlY3RvcnMgdG8gZXJhc2VcbiIpOworCQl9CisJCXJldHVybiAxOworCX0KKworCXByb3QgPSAwOworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKKwkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKKwkJCXByb3QrKzsKKwkJfQorCX0KKworCWlmIChwcm90KSB7CisJCXByaW50ZiAoIi0gV2FybmluZzogJWQgcHJvdGVjdGVkIHNlY3RvciVzIHdpbGwgbm90IGJlIGVyYXNlZCFcbiIsIHByb3QsIChwcm90ID4gMSA/ICJzIiA6ICIiKSk7CisJfQorCisJc3RhcnQgPSBnZXRfdGltZXIgKDApOworCWxhc3QgPSAwOworCWhhZGVyciA9IDA7CisKKwlmb3IgKHNlY3QgPSBzX2ZpcnN0OyBzZWN0IDw9IHNfbGFzdDsgc2VjdCsrKSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJdWxvbmcgZXN0YXJ0OworCQkJaW50IHNlY3Rkb25lOworCisJCQliYW5rX2VyYXNlX2luaXQgKGluZm8sIHNlY3QpOworCisJCQkvKiB3YWl0IGF0IGxlYXN0IDgwdXMgLSBsZXQncyB3YWl0IDEgbXMgKi8KKwkJCXVkZWxheSAoMTAwMCk7CisKKwkJCWVzdGFydCA9IGdldF90aW1lciAoc3RhcnQpOworCisJCQlkbyB7CisJCQkJbm93ID0gZ2V0X3RpbWVyIChzdGFydCk7CisKKwkJCQlpZiAobm93IC0gZXN0YXJ0ID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKKwkJCQkJcHJpbnRmICgiVGltZW91dCAoc2VjdCAlZClcbiIsIHNlY3QpOworCQkJCQloYWRlcnIgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisjaWZuZGVmIEZMQVNIX0RFQlVHCisJCQkJLyogc2hvdyB0aGF0IHdlJ3JlIHdhaXRpbmcgKi8KKwkJCQlpZiAoKG5vdyAtIGxhc3QpID4gMTAwMCkgewkvKiBldmVyeSBzZWNvbmQgKi8KKwkJCQkJcHV0YyAoJy4nKTsKKwkJCQkJbGFzdCA9IG5vdzsKKwkJCQl9CisjZW5kaWYKKworCQkJCXNlY3Rkb25lID0gYmFua19lcmFzZV9wb2xsIChpbmZvLCBzZWN0KTsKKworCQkJCWlmIChzZWN0ZG9uZSA8IDApIHsKKwkJCQkJaGFkZXJyID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9IHdoaWxlICghc2VjdGRvbmUpOworCisJCQlpZiAoaGFkZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGhhZGVyciA+IDApCisJCXByaW50ZiAoIiBmYWlsZWRcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiIGRvbmVcbiIpOworCisJLyogcmVzZXQgdG8gcmVhZCBtb2RlICovCisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgeworCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KKwkJCWJhbmtfcmVzZXQgKGluZm8sIHNlY3QpOworCQl9CisJfQorCXJldHVybiBoYWRlcnI7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9pbnRlbF9mbGFzaC5oIGIvYm9hcmQvTWFydmVsbC9jb21tb24vaW50ZWxfZmxhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjZhNGNkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9jb21tb24vaW50ZWxfZmxhc2guaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIYWNrZWQgZm9yIHRoZSBtYXJ2ZWxsIGRiNjQzNjAgZXZhbCBib2FyZCBieQorICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICovCisKKy8qKioqKioqKioqKioqKiogREVGSU5FUyBmb3IgSW50ZWwgU3RyYXRhRmxhc2ggRkxBU0ggY2hpcCAqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGFjY2VwdGFibGUgY2hpcHMgdHlwZXMgYXJlOgorICoKKyAqCTI4RjMyMEo1LCAyOEY2NDBKNSwgMjhGMzIwSjNBLCAyOEY2NDBKM0EgYW5kIDI4RjEyOEozQQorICovCisKKy8qIHJlZ2lzdGVyIGFkZHJlc3NlcywgdmFsaWQgb25seSBmb2xsb3dpbmcgYW4gQ0hJUF9DTURfUkRfSUQgY29tbWFuZCAqLworI2RlZmluZSBDSElQX0FERFJfUkVHX01BTgkweDAwMDAwMAkvKiBtYW51ZmFjdHVyZXIncyBpZCAqLworI2RlZmluZSBDSElQX0FERFJfUkVHX0RFVgkweDAwMDAwMQkvKiBkZXZpY2UgaWQgKi8KKyNkZWZpbmUgQ0hJUF9BRERSX1JFR19DRkdNCTB4MDAwMDAzCS8qIG1hc3RlciBsb2NrIGNvbmZpZyAqLworI2RlZmluZSBDSElQX0FERFJfUkVHX0NGRyhiKQkoKChiKTw8MTYpfDIpCS8qIGxvY2sgY29uZmlnIGZvciBibG9jayBiICovCisKKy8qIENvbW1hbmRzICovCisjZGVmaW5lIENISVBfQ01EX1JTVAkJMHhGRgkJLyogcmVzZXQgZmxhc2ggKi8KKyNkZWZpbmUgQ0hJUF9DTURfUkRfSUQJCTB4OTAJCS8qIHJlYWQgdGhlIGlkIGFuZCBsb2NrIGJpdHMgKi8KKyNkZWZpbmUgQ0hJUF9DTURfUkRfUVVFUlkJMHg5OAkJLyogcmVhZCBkZXZpY2UgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIENISVBfQ01EX1JEX1NUQVQJMHg3MAkJLyogcmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIENISVBfQ01EX0NMUl9TVEFUCTB4NTAJCS8qIGNsZWFyIHRoZSBzdGF1cyByZWdpc3RlciAqLworI2RlZmluZSBDSElQX0NNRF9XUl9CVUYJCTB4RTgJCS8qIGNsZWFyIHRoZSBzdGF1cyByZWdpc3RlciAqLworI2RlZmluZSBDSElQX0NNRF9QUk9HCQkweDQwCQkvKiBwcm9ncmFtIHdvcmQgY29tbWFuZCAqLworI2RlZmluZSBDSElQX0NNRF9FUkFTRTEJCTB4MjAJCS8qIDFzdCB3b3JkIGZvciBibG9jayBlcmFzZSAqLworI2RlZmluZSBDSElQX0NNRF9FUkFTRTIJCTB4RDAJCS8qIDJuZCB3b3JkIGZvciBibG9jayBlcmFzZSAqLworI2RlZmluZSBDSElQX0NNRF9FUkFTRV9TVVNQCTB4QjAJCS8qIHN1c3BlbmQgYmxvY2sgZXJhc2UgKi8KKyNkZWZpbmUgQ0hJUF9DTURfTE9DSwkJMHg2MAkJLyogMXN0IHdvcmQgZm9yIGFsbCBsb2NrIGNtZHMgKi8KKyNkZWZpbmUgQ0hJUF9DTURfU0VUX0xPQ0tfQkxLCTB4MDEJCS8qIDJuZCB3cmQgc2V0IGJsb2NrIGxvY2sgYml0ICovCisjZGVmaW5lIENISVBfQ01EX1NFVF9MT0NLX01TVFIJMHhGMQkJLyogMm5kIHdyZCBzZXQgbWFzdGVyIGxjayBiaXQgKi8KKyNkZWZpbmUgQ0hJUF9DTURfQ0xSX0xPQ0tfQkxLCTB4RDAJCS8qIDJuZCB3cmQgY2xlYXIgYmxrIGxjayBiaXQgKi8KKworLyogc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQ0hJUF9TVEFUX0RQUwkJMHgwMgkJLyogRGV2aWNlIFByb3RlY3QgU3RhdHVzICovCisjZGVmaW5lIENISVBfU1RBVF9WUFBTCQkweDA4CQkvKiBWUFAgU3RhdHVzICovCisjZGVmaW5lIENISVBfU1RBVF9QU0xCUwkJMHgxMAkJLyogUHJvZ3JhbStTZXQgTG9jayBCaXQgU3RhdCAqLworI2RlZmluZSBDSElQX1NUQVRfRUNMQlMJCTB4MjAJCS8qIEVyYXNlK0NsciBMb2NrIEJpdCBTdGF0ICovCisjZGVmaW5lIENISVBfU1RBVF9FU1MJCTB4NDAJCS8qIEVyYXNlIFN1c3BlbmQgU3RhdHVzICovCisjZGVmaW5lIENISVBfU1RBVF9SRFkJCTB4ODAJCS8qIFdTTSBNYWNoIFN0YXR1cywgMT1yZHkgKi8KKworI2RlZmluZSBDSElQX1NUQVRfRVJSCQkoQ0hJUF9TVEFUX1ZQUFMgfCBDSElQX1NUQVRfRFBTIHwgXAorCQkJCSAgICBDSElQX1NUQVRfRUNMQlMgfCBDSElQX1NUQVRfUFNMQlMpCisKKy8qIElEIGFuZCBMb2NrIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0hJUF9SRF9JRF9MT0NLCQkweDAxCQkvKiBCaXQgMCBvZiBlYWNoIGJ5dGUgKi8KKyNkZWZpbmUgQ0hJUF9SRF9JRF9NQU4JCTB4ODkJCS8qIE1hbnVmYWN0dXJlciBjb2RlID0gMHg4OSAqLworI2RlZmluZSBDSElQX1JEX0lEX0RFVgkJQ0ZHX0ZMQVNIX0lECisKKy8qIGRpbWVuc2lvbnMgKi8KKyNkZWZpbmUgQ0hJUF9XSURUSAkJMgkJLyogY2hpcHMgYXJlIGluIDE2IGJpdCBtb2RlICovCisjZGVmaW5lIENISVBfV1NISUZUCQkxCQkvKiAobG9nMiBvZiBDSElQX1dJRFRIKSAqLworI2RlZmluZSBDSElQX05CTE9DS1MJCTEyOAorI2RlZmluZSBDSElQX0JMS1NaCQkoMTI4ICogMTAyNCkJLyogb2YgMTI4S2J5dGVzIGVhY2ggKi8KKyNkZWZpbmUgQ0hJUF9TSVpFCQkoQ0hJUF9CTEtTWiAqIENISVBfTkJMT0NLUykKKworLyoqKioqKioqKioqKioqKioqKioqKiogREVGSU5FUyBmb3IgSHltb2QgRmxhc2ggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGh5bW9kIGJvYXJkIGhhcyAyIHggMjhGMzIwSjUgY2hpcHMgcnVubmluZyBpbgorICogMTYgYml0IG1vZGUsIGZvciBhIDMyIGJpdCB3aWRlIGJhbmsuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBiYW5rX3dvcmRfdDsJCS8qIDgvMTYvMzIvNjRiaXQgdW5zaWduZWQgaW50ICovCit0eXBlZGVmIHZvbGF0aWxlIGJhbmtfd29yZF90ICpiYW5rX2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBiYW5rX3NpemVfdDsJCS8qIHdhbnQgdGhpcyBiaWcgLSA+PSAzMiBiaXQgKi8KKworI2RlZmluZSBCQU5LX0NISVBfV0lEVEgJCTEJCS8qIGVhY2ggYmFuayBpcyAxIGNoaXAgd2lkZSAqLworI2RlZmluZSBCQU5LX0NISVBfV1NISUZUCTAJCS8qIChsb2cyIG9mIEJBTktfQ0hJUF9XSURUSCkgKi8KKworI2RlZmluZSBCQU5LX1dJRFRICQkoQ0hJUF9XSURUSCAqIEJBTktfQ0hJUF9XSURUSCkKKyNkZWZpbmUgQkFOS19XU0hJRlQJCShDSElQX1dTSElGVCArIEJBTktfQ0hJUF9XU0hJRlQpCisjZGVmaW5lIEJBTktfTkJMT0NLUwkJQ0hJUF9OQkxPQ0tTCisjZGVmaW5lIEJBTktfQkxLU1oJCShDSElQX0JMS1NaICogQkFOS19DSElQX1dJRFRIKQorI2RlZmluZSBCQU5LX1NJWkUJCShDSElQX1NJWkUgKiBCQU5LX0NISVBfV0lEVEgpCisKKyNkZWZpbmUgTUFYX0JBTktTCQkxCQkvKiBvbmx5IG9uZSBiYW5rIHBvc3NpYmxlICovCisKKy8qIGFsaWduIGJhbmsgYWRkcmVzc2VzIGFuZCBzaXplcyB0byBiYW5rIHdvcmQgYm91bmRhcmllcyAqLworI2RlZmluZSBCQU5LX0FERFJfV09SRF9BTElHTihhKQkoKGJhbmtfYWRkcl90KSgoYmFua19zaXplX3QpKGEpIFwKKwkJCQkgICAgJiB+KEJBTktfV0lEVEggLSAxKSkpCisjZGVmaW5lIEJBTktfU0laRV9XT1JEX0FMSUdOKHMpCSgoYmFua19zaXplX3QpQkFOS19BRERSX1dPUkRfQUxJR04oIFwKKwkJCQkgICAgKGJhbmtfc2l6ZV90KShzKSArIChCQU5LX1dJRFRIIC0gMSkpKQorCisvKiBhbGlnbiBiYW5rIGFkZHJlc3NlcyBhbmQgc2l6ZXMgdG8gYmFuayBibG9jayBib3VuZGFyaWVzICovCisjZGVmaW5lIEJBTktfQUREUl9CTEtfQUxJR04oYSkJKChiYW5rX2FkZHJfdCkoKGJhbmtfc2l6ZV90KShhKSBcCisJCQkJICAgICYgfihCQU5LX0JMS1NaIC0gMSkpKQorI2RlZmluZSBCQU5LX1NJWkVfQkxLX0FMSUdOKHMpCSgoYmFua19zaXplX3QpQkFOS19BRERSX0JMS19BTElHTiggXAorCQkJCSAgICAoYmFua19zaXplX3QpKHMpICsgKEJBTktfQkxLU1ogLSAxKSkpCisKKy8qIGFsaWduIGJhbmsgYWRkcmVzc2VzIGFuZCBzaXplcyB0byBiYW5rIGJvdW5kYXJpZXMgKi8KKyNkZWZpbmUgQkFOS19BRERSX0JBTktfQUxJR04oYSkJKChiYW5rX2FkZHJfdCkoKGJhbmtfc2l6ZV90KShhKSBcCisJCQkJICAgICYgfihCQU5LX1NJWkUgLSAxKSkpCisjZGVmaW5lIEJBTktfU0laRV9CQU5LX0FMSUdOKHMpCSgoYmFua19zaXplX3QpQkFOS19BRERSX0JBTktfQUxJR04oIFwKKwkJCQkgICAgKGJhbmtfc2l6ZV90KShzKSArIChCQU5LX1NJWkUgLSAxKSkpCisKKy8qIGFkZCBhbiBvZmZzZXQgdG8gYSBiYW5rIGFkZHJlc3MgKi8KKyNkZWZpbmUgQkFOS19BRERSX09GRlNFVChhLCBvKQkoYmFua19hZGRyX3QpKChiYW5rX3NpemVfdCkoYSkgKyBcCisJCQkJICAgIChiYW5rX3NpemVfdCkobykpCisKKy8qIGdldCBiYXNlIGFkZHJlc3Mgb2YgYmFuayBiLCBnaXZlbiBmbGFzaCBiYXNlIGFkZHJlc3MgYSAqLworI2RlZmluZSBCQU5LX0FERFJfQkFTRShhLCBiKQlCQU5LX0FERFJfT0ZGU0VUKEJBTktfQUREUl9CQU5LX0FMSUdOKGEpLCBcCisJCQkJICAgIChiYW5rX3NpemVfdCkoYikgKiBCQU5LX1NJWkUpCisKKy8qIGFkanVzdCBhIGJhbmsgYWRkcmVzcyB0byBzdGFydCBvZiBuZXh0IHdvcmQsIGJsb2NrIG9yIGJhbmsgKi8KKyNkZWZpbmUgQkFOS19BRERSX05FWFRfV09SRChhKQlCQU5LX0FERFJfT0ZGU0VUKEJBTktfQUREUl9XT1JEX0FMSUdOKGEpLCBcCisJCQkJICAgIEJBTktfV0lEVEgpCisjZGVmaW5lIEJBTktfQUREUl9ORVhUX0JMSyhhKQlCQU5LX0FERFJfT0ZGU0VUKEJBTktfQUREUl9CTEtfQUxJR04oYSksIFwKKwkJCQkgICAgQkFOS19CTEtTWikKKyNkZWZpbmUgQkFOS19BRERSX05FWFRfQkFOSyhhKQlCQU5LX0FERFJfT0ZGU0VUKEJBTktfQUREUl9CQU5LX0FMSUdOKGEpLCBcCisJCQkJICAgIEJBTktfU0laRSkKKworLyogZ2V0IGJhbmsgYWRkcmVzcyBvZiBjaGlwIHJlZ2lzdGVyIHIgZ2l2ZW4gYSBiYW5rIGJhc2UgYWRkcmVzcyBhICovCisjZGVmaW5lIEJBTktfQUREUl9SRUcoYSwgcikJQkFOS19BRERSX09GRlNFVChCQU5LX0FERFJfQkFOS19BTElHTihhKSwgXAorCQkJCSAgICAoKGJhbmtfc2l6ZV90KShyKSA8PCBCQU5LX1dTSElGVCkpCisKKy8qIG1ha2UgYSBiYW5rIGFkZHJlc3MgZm9yIGVhY2ggY2hpcCByZWdpc3RlciBhZGRyZXNzICovCisKKyNkZWZpbmUgQkFOS19BRERSX1JFR19NQU4oYSkJQkFOS19BRERSX1JFRygoYSksIENISVBfQUREUl9SRUdfTUFOKQorI2RlZmluZSBCQU5LX0FERFJfUkVHX0RFVihhKQlCQU5LX0FERFJfUkVHKChhKSwgQ0hJUF9BRERSX1JFR19ERVYpCisjZGVmaW5lIEJBTktfQUREUl9SRUdfQ0ZHTShhKQlCQU5LX0FERFJfUkVHKChhKSwgQ0hJUF9BRERSX1JFR19DRkdNKQorI2RlZmluZSBCQU5LX0FERFJfUkVHX0NGRyhiLGEpCUJBTktfQUREUl9SRUcoKGEpLCBDSElQX0FERFJfUkVHX0NGRyhiKSkKKworLyoKKyAqIHJlcGxpY2F0ZSBhIGNoaXAgY21kL3N0YXQvcmQgdmFsdWUgaW50byBlYWNoIGJ5dGUgcG9zaXRpb24gd2l0aGluIGEgd29yZAorICogc28gdGhhdCBtdWx0aXBsZSBjaGlwcyBhcmUgYWNjZXNzZWQgaW4gYSBzaW5nbGUgd29yZCBpL28gb3BlcmF0aW9uCisgKgorICogdGhpcyBtdXN0IGJlIGFzIHdpZGUgYXMgdGhlIGJhbmtfd29yZF90IHR5cGUsIGFuZCB0YWtlIGludG8gYWNjb3VudCB0aGUKKyAqIGNoaXAgd2lkdGggYW5kIGJhbmsgbGF5b3V0CisgKi8KKworI2RlZmluZSBCQU5LX0ZJTExfV09SRChvKQkoKGJhbmtfd29yZF90KShvKSkKKworLyogbWFrZSBhIGJhbmsgd29yZCB2YWx1ZSBmb3IgZWFjaCBjaGlwIGNtZC9zdGF0L3JkIHZhbHVlICovCisKKy8qIENvbW1hbmRzICovCisjZGVmaW5lIEJBTktfQ01EX1JTVAkJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfUlNUKQorI2RlZmluZSBCQU5LX0NNRF9SRF9JRAkJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfUkRfSUQpCisjZGVmaW5lIEJBTktfQ01EX1JEX1NUQVQJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfUkRfU1RBVCkKKyNkZWZpbmUgQkFOS19DTURfQ0xSX1NUQVQJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfQ0xSX1NUQVQpCisjZGVmaW5lIEJBTktfQ01EX0VSQVNFMQkJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfRVJBU0UxKQorI2RlZmluZSBCQU5LX0NNRF9FUkFTRTIJCUJBTktfRklMTF9XT1JEKENISVBfQ01EX0VSQVNFMikKKyNkZWZpbmUgQkFOS19DTURfUFJPRwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfUFJPRykKKyNkZWZpbmUgQkFOS19DTURfTE9DSwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfTE9DSykKKyNkZWZpbmUgQkFOS19DTURfU0VUX0xPQ0tfQkxLCUJBTktfRklMTF9XT1JEKENISVBfQ01EX1NFVF9MT0NLX0JMSykKKyNkZWZpbmUgQkFOS19DTURfU0VUX0xPQ0tfTVNUUglCQU5LX0ZJTExfV09SRChDSElQX0NNRF9TRVRfTE9DS19NU1RSKQorI2RlZmluZSBCQU5LX0NNRF9DTFJfTE9DS19CTEsJQkFOS19GSUxMX1dPUkQoQ0hJUF9DTURfQ0xSX0xPQ0tfQkxLKQorCisvKiBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBCQU5LX1NUQVRfRFBTCQlCQU5LX0ZJTExfV09SRChDSElQX1NUQVRfRFBTKQorI2RlZmluZSBCQU5LX1NUQVRfUFNTCQlCQU5LX0ZJTExfV09SRChDSElQX1NUQVRfUFNTKQorI2RlZmluZSBCQU5LX1NUQVRfVlBQUwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9TVEFUX1ZQUFMpCisjZGVmaW5lIEJBTktfU1RBVF9QU0xCUwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9TVEFUX1BTTEJTKQorI2RlZmluZSBCQU5LX1NUQVRfRUNMQlMJCUJBTktfRklMTF9XT1JEKENISVBfU1RBVF9FQ0xCUykKKyNkZWZpbmUgQkFOS19TVEFUX0VTUwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9TVEFUX0VTUykKKyNkZWZpbmUgQkFOS19TVEFUX1JEWQkJQkFOS19GSUxMX1dPUkQoQ0hJUF9TVEFUX1JEWSkKKworI2RlZmluZSBCQU5LX1NUQVRfRVJSCQlCQU5LX0ZJTExfV09SRChDSElQX1NUQVRfRVJSKQorCisvKiBJRCBhbmQgTG9jayBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIEJBTktfUkRfSURfTE9DSwkJQkFOS19GSUxMX1dPUkQoQ0hJUF9SRF9JRF9MT0NLKQorI2RlZmluZSBCQU5LX1JEX0lEX01BTgkJQkFOS19GSUxMX1dPUkQoQ0hJUF9SRF9JRF9NQU4pCisjZGVmaW5lIEJBTktfUkRfSURfREVWCQlCQU5LX0ZJTExfV09SRChDSElQX1JEX0lEX0RFVikKZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL21lbW9yeS5jIGIvYm9hcmQvTWFydmVsbC9jb21tb24vbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNTNhZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL21lbW9yeS5jCkBAIC0wLDAgKzEsMTM5MCBAQAorLyoKKyAqIENvcHlyaWdodCAtIEdhbGlsZW8gdGVjaG5vbG9neS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICoKKyAqIHdyaXR0ZW4gb3IgY29sbGVjdGVkIGFuZCBzb21ldGltZXMgcmV3cml0dGVuIGJ5CisgKiBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICovCisKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvY29yZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWVtb3J5LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeUdldEJhbmtCYXNlQWRkcmVzcyAtIFJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIG1lbW9yeSBiYW5rLgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2Ygb25lIG9mIHRoZSBTRFJBTZJzIG1lbW9yeQorKiAgICAgICBiYW5rcy4gVGhlcmUgYXJlIDQgbWVtb3J5IGJhbmtzIGFuZCBlYWNoIG9uZSByZXByZXNlbnRzIG9uZSBESU1NIHNpZGUuCisqIElOUFVUOgorKiAgICAgICBNRU1PUllfQkFOSyBiYW5rIC0gU2VsZWN0cyBvbmUgb2YgdGhlIGZvdXIgYmFua3MgYXMgZGVmaW5lZCBpbiBNZW1vcnkuaC4KKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKiBSRVRVUk46CisqICAgICAgIDMyIGJpdCBNZW1vcnkgYmFuayBiYXNlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWVtb3J5R2V0QmFua1JlZ09mZnNldCAoTUVNT1JZX0JBTksgYmFuaykKK3sKKwlzd2l0Y2ggKGJhbmspIHsKKwljYXNlIEJBTkswOgorCQlyZXR1cm4gU0NTXzBfTE9XX0RFQ09ERV9BRERSRVNTOworCWNhc2UgQkFOSzE6CisJCXJldHVybiBTQ1NfMV9MT1dfREVDT0RFX0FERFJFU1M7CisJY2FzZSBCQU5LMjoKKwkJcmV0dXJuIFNDU18yX0xPV19ERUNPREVfQUREUkVTUzsKKwljYXNlIEJBTkszOgorCQlyZXR1cm4gU0NTXzNfTE9XX0RFQ09ERV9BRERSRVNTOworCisJfQorCXJldHVybiBTQ1NfMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qIGRlZmF1bHQgdmFsdWUgKi8KK30KKwordW5zaWduZWQgaW50IG1lbW9yeUdldEJhbmtCYXNlQWRkcmVzcyAoTUVNT1JZX0JBTksgYmFuaykKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0ID0gbWVtb3J5R2V0QmFua1JlZ09mZnNldCAoYmFuayk7CisKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0LCAmYmFzZSk7CisJYmFzZSA9IGJhc2UgPDwgMTY7CS8qIE1WNjQzNnggKi8KKwlyZXR1cm4gYmFzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWVtb3J5R2V0RGV2aWNlQmFzZUFkZHJlc3MgLSBSZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBkZXZpY2UuCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIGRldmljZSBvbiB0aGUgc3lzdGVtLiBUaGVyZQorKiAgICAgICBhcmUgNSBwb3NzaWJsZSBkZXZpY2VzICgwIC0gNCBhbmQgb25lIGJvb3QgZGV2aWNlKSBhcyBkZWZpbmVkIGluCisqICAgICAgIGd0TWVtb3J5LmguIEVhY2ggb2YgdGhlIGRldmljZSBwYXJhbWV0ZXJzIGlzIG1hcGVkIHRvIG9uZSBvZiB0aGUgQ1MKKyogICAgICAgKERldmljZXMgY2hpcCBzZWxlY3RzKSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIuCisqIElOUFVUOgorKiAgICAgICBkZXZpY2UgLSBTZWxlY3RzIG9uZSBvZiB0aGUgZml2ZSBkZXZpY2VzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmguCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyogUkVUVVJOOgorKiAgICAgICAzMiBiaXQgRGV2aWNlIGJhc2UgYWRkcmVzcy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZVJlZ09mZnNldCAoREVWSUNFIGRldmljZSkKK3sKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgREVWSUNFMDoKKwkJcmV0dXJuIENTXzBfTE9XX0RFQ09ERV9BRERSRVNTOworCWNhc2UgREVWSUNFMToKKwkJcmV0dXJuIENTXzFfTE9XX0RFQ09ERV9BRERSRVNTOworCWNhc2UgREVWSUNFMjoKKwkJcmV0dXJuIENTXzJfTE9XX0RFQ09ERV9BRERSRVNTOworCWNhc2UgREVWSUNFMzoKKwkJcmV0dXJuIENTXzNfTE9XX0RFQ09ERV9BRERSRVNTOworCWNhc2UgQk9PVF9ERVZJQ0U6CisJCXJldHVybiBCT09UQ1NfTE9XX0RFQ09ERV9BRERSRVNTOworCX0KKwlyZXR1cm4gQ1NfMF9MT1dfREVDT0RFX0FERFJFU1M7CS8qIGRlZmF1bHQgdmFsdWUgKi8KK30KKwordW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChERVZJQ0UgZGV2aWNlKQoreworCXVuc2lnbmVkIGludCByZWdCYXNlOworCXVuc2lnbmVkIGludCByZWdPZmZzZXQgPSBtZW1vcnlHZXREZXZpY2VSZWdPZmZzZXQgKGRldmljZSk7CisKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0LCAmcmVnQmFzZSk7CisKKwlyZWdCYXNlID0gcmVnQmFzZSA8PCAxNjsJLyogTVY2NDM2eCAqLworCXJldHVybiByZWdCYXNlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBNZW1vcnlHZXRQY2lCYXNlQWRkciAtIFJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDSSB3aW5kb3cuCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDSSB3aW5kb3cuIFRoZXJlIGFyZSA1CisqICAgICAgIHBvc3NpYmxlIFBDSSB3aW5kb3dzIChtZW1vcnkgMCAtIDMgYW5kIG9uZSBmb3IgSS9PKSBmb3IgZWFjaCBQQ0kKKyogICAgICAgaW50ZXJmYWNlIGFzIGRlZmluZWQgaW4gZ3RNZW1vcnkuaCwgdXNlZCBieSB0aGUgQ1BVJ3MgYWRkcmVzcyBkZWNvZGluZworKiAgICAgICBtZWNoYW5pc20uCisqCU5ldyBpbiBNVjY0MzZ4CisqIElOUFVUOgorKiAgICAgICBwY2lXaW5kb3cgLSBTZWxlY3RzIG9uZSBvZiB0aGUgUENJIHdpbmRvd3MgYXMgZGVmaW5lZCBpbiBNZW1vcnkuaC4KKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKiBSRVRVUk46CisqICAgICAgIDMyIGJpdCBQQ0kgd2luZG93IGJhc2UgYWRkcmVzcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgTWVtb3J5R2V0UGNpQmFzZUFkZHIgKFBDSV9NRU1fV0lORE9XIHBjaVdpbmRvdykKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZUFkZHJSZWcsIGJhc2U7CisKKwlzd2l0Y2ggKHBjaVdpbmRvdykgeworCWNhc2UgUENJXzBfSU86CisJCWJhc2VBZGRyUmVnID0gUENJXzBJX09fTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX0lPX0JBU0VfQUREUjsgICovCisJCWJyZWFrOworCWNhc2UgUENJXzBfTUVNMDoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfME1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTBfQkFTRV9BRERSOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTE6CisJCWJhc2VBZGRyUmVnID0gUENJXzBNRU1PUlkxX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkxX0JBU0VfQUREUjsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMF9NRU0yOgorCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMl9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMl9CQVNFX0FERFI7ICAqLworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTM6CisJCWJhc2VBZGRyUmVnID0gUENJXzBNRU1PUlkzX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkzX0JBU0VfQUREUjsgICovCisJCWJyZWFrOworI2lmZGVmIElOQ0xVREVfUENJXzEKKwljYXNlIFBDSV8xX0lPOgorCQliYXNlQWRkclJlZyA9IFBDSV8xSV9PX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9JT19CQVNFX0FERFI7ICAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTA6CisJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkwX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkwX0JBU0VfQUREUjsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMV9NRU0xOgorCQliYXNlQWRkclJlZyA9IFBDSV8xTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMV9CQVNFX0FERFI7ICAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTI6CisJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkyX0JBU0VfQUREUjsgICovCisJCWJyZWFrOworCWNhc2UgUENJXzFfTUVNMzoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfMU1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTNfQkFTRV9BRERSOyAqLworCQlicmVhazsKKyNlbmRpZiAvKiBJTkNMVURFX1BDSV8xICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJfQorCUdUX1JFR19SRUFEIChiYXNlQWRkclJlZywgJmJhc2UpOworCXJldHVybiAoYmFzZSA8PCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeUdldEJhbmtTaXplIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBiYW5rLgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIG1lbW9yeSBiYW5rIGFzIGRlc2NyaWJlZCBpbgorKiAgICAgICAnZ3RNZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MnIGZ1bmN0aW9uLgorKiBJTlBVVDoKKyogICAgICAgYmFuayAtIFNlbGVjdHMgb25lIG9mIHRoZSBmb3VyIGJhbmtzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmguCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyogUkVUVVJOOgorKiAgICAgICAzMiBiaXQgc2l6ZSBtZW1vcnkgYmFuayBzaXplIG9yIDAgZm9yIGEgY2xvc2VkIG9yIG5vbiBwb3B1bGF0ZWQgYmFuay4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgbWVtb3J5R2V0QmFua1NpemUgKE1FTU9SWV9CQU5LIGJhbmspCit7CisJdW5zaWduZWQgaW50IHNpemVSZWcsIHNpemU7CisJTUVNT1JZX1dJTkRPVyB3aW5kb3c7CisKKwlzd2l0Y2ggKGJhbmspIHsKKwljYXNlIEJBTkswOgorCQlzaXplUmVnID0gU0NTXzBfSElHSF9ERUNPREVfQUREUkVTUzsJLyogQ1NfMF9TSVpFOyAqLworCQl3aW5kb3cgPSBDU18wX1dJTkRPVzsKKwkJYnJlYWs7CisJY2FzZSBCQU5LMToKKwkJc2l6ZVJlZyA9IFNDU18xX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qIENTXzFfU0laRTsgKi8KKwkJd2luZG93ID0gQ1NfMV9XSU5ET1c7CisJCWJyZWFrOworCWNhc2UgQkFOSzI6CisJCXNpemVSZWcgPSBTQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKiBDU18yX1NJWkU7ICovCisJCXdpbmRvdyA9IENTXzJfV0lORE9XOworCQlicmVhazsKKwljYXNlIEJBTkszOgorCQlzaXplUmVnID0gU0NTXzNfSElHSF9ERUNPREVfQUREUkVTUzsJLyogQ1NfM19TSVpFOyAqLworCQl3aW5kb3cgPSBDU18zX1dJTkRPVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwkvKiBJZiB0aGUgd2luZG93IGlzIGNsb3NlZCwgYSBzaXplIG9mIDAgaXMgcmV0dXJuZWQgKi8KKwlpZiAoTWVtb3J5R2V0TWVtV2luZG93U3RhdHVzICh3aW5kb3cpICE9IE1FTV9XSU5ET1dfRU5BQkxFRCkKKwkJcmV0dXJuIDA7CisJR1RfUkVHX1JFQUQgKHNpemVSZWcsICZzaXplKTsKKwlzaXplID0gKChzaXplIDw8IDE2KSB8IDB4ZmZmZikgKyAxOworCXJldHVybiBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlHZXREZXZpY2VTaXplIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiBhIGRldmljZSBtZW1vcnkgc3BhY2UuCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1lbW9yeSBzcGFjZSBzaXplIG9mIGEgZ2l2ZW4gZGV2aWNlLgorKiBJTlBVVDoKKyogICAgICAgZGV2aWNlIC0gU2VsZWN0cyBvbmUgb2YgdGhlIGZpdmUgZGV2aWNlcyBhcyBkZWZpbmVkIGluIE1lbW9yeS5oLgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqIFJFVFVSTjoKKyogICAgICAgMzIgYml0IHNpemUgb2YgYSBkZXZpY2UgbWVtb3J5IHNwYWNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBtZW1vcnlHZXREZXZpY2VTaXplIChERVZJQ0UgZGV2aWNlKQoreworCXVuc2lnbmVkIGludCBzaXplUmVnLCBzaXplOworCU1FTU9SWV9XSU5ET1cgd2luZG93OworCisJc3dpdGNoIChkZXZpY2UpIHsKKwljYXNlIERFVklDRTA6CisJCXNpemVSZWcgPSBDU18wX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qREVWX0NTMF9TSVpFOyAqLworCQl3aW5kb3cgPSBERVZDU18wX1dJTkRPVzsKKwkJYnJlYWs7CisJY2FzZSBERVZJQ0UxOgorCQlzaXplUmVnID0gQ1NfMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzFfU0laRTsgKi8KKwkJd2luZG93ID0gREVWQ1NfMV9XSU5ET1c7CisJCWJyZWFrOworCWNhc2UgREVWSUNFMjoKKwkJc2l6ZVJlZyA9IENTXzJfSElHSF9ERUNPREVfQUREUkVTUzsJLypERVZfQ1MyX1NJWkU7ICovCisJCXdpbmRvdyA9IERFVkNTXzJfV0lORE9XOworCQlicmVhazsKKwljYXNlIERFVklDRTM6CisJCXNpemVSZWcgPSBDU18zX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qREVWX0NTM19TSVpFOyAqLworCQl3aW5kb3cgPSBERVZDU18zX1dJTkRPVzsKKwkJYnJlYWs7CisJY2FzZSBCT09UX0RFVklDRToKKwkJc2l6ZVJlZyA9IEJPT1RDU19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkJPT1RDU19TSVpFOyAqLworCQl3aW5kb3cgPSBCT09UX0NTX1dJTkRPVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKwkvKiBJZiB0aGUgd2luZG93IGlzIGNsb3NlZCwgYSBzaXplIG9mIDAgaXMgcmV0dXJuZWQgKi8KKwlpZiAoTWVtb3J5R2V0TWVtV2luZG93U3RhdHVzICh3aW5kb3cpICE9IE1FTV9XSU5ET1dfRU5BQkxFRCkKKwkJcmV0dXJuIDA7CisJR1RfUkVHX1JFQUQgKHNpemVSZWcsICZzaXplKTsKKwlzaXplID0gKChzaXplIDw8IDE2KSB8IDB4ZmZmZikgKyAxOworCXJldHVybiBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBNZW1vcnlHZXRQY2lXaW5kb3dTaXplIC0gUmV0dXJucyB0aGUgc2l6ZSBvZiBhIFBDSSBtZW1vcnkgd2luZG93LgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplIG9mIGEgUENJIHdpbmRvdy4KKyogSU5QVVQ6CisqICAgICAgIHBjaVdpbmRvdyAtIFNlbGVjdHMgb25lIG9mIHRoZSBQQ0kgbWVtb3J5IHdpbmRvd3MgYXMgZGVmaW5lZCBpbgorKiAgICAgICBNZW1vcnkuaC4KKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKiBSRVRVUk46CisqICAgICAgIDMyIGJpdCBzaXplIG9mIGEgUENJIG1lbW9yeSB3aW5kb3cuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IE1lbW9yeUdldFBjaVdpbmRvd1NpemUgKFBDSV9NRU1fV0lORE9XIHBjaVdpbmRvdykKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZVJlZywgc2l6ZTsKKworCXN3aXRjaCAocGNpV2luZG93KSB7CisJY2FzZSBQQ0lfMF9JTzoKKwkJc2l6ZVJlZyA9IFBDSV8wSV9PX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfSU9fU0laRTsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMF9NRU0wOgorCQlzaXplUmVnID0gUENJXzBNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMF9TSVpFOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTE6CisJCXNpemVSZWcgPSBQQ0lfME1FTU9SWTFfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkxX1NJWkU7ICovCisJCWJyZWFrOworCWNhc2UgUENJXzBfTUVNMjoKKwkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTJfU0laRTsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMF9NRU0zOgorCQlzaXplUmVnID0gUENJXzBNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZM19TSVpFOyAqLworCQlicmVhazsKKyNpZmRlZiBJTkNMVURFX1BDSV8xCisJY2FzZSBQQ0lfMV9JTzoKKwkJc2l6ZVJlZyA9IFBDSV8xSV9PX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfSU9fU0laRTsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMV9NRU0wOgorCQlzaXplUmVnID0gUENJXzFNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMF9TSVpFOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTE6CisJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTFfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkxX1NJWkU7ICAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTI6CisJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTJfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkyX1NJWkU7ICAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTM6CisJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTNfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkzX1NJWkU7ICovCisJCWJyZWFrOworI2VuZGlmIC8qIElOQ0xVREVfUENJXzEgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gMHgwOworCX0KKwkvKiBJZiB0aGUgbWVtb3J5IHdpbmRvdyBpcyBkaXNhYmxlZCwgcmV0cnVuIHNpemUgPSAwICovCisJaWYgKE1lbW9yeUdldE1lbVdpbmRvd1N0YXR1cyAoUENJXzBfSU9fV0lORE9XIDw8IHBjaVdpbmRvdykKKwkgICAgPT0gTUVNX1dJTkRPV19ESVNBQkxFRCkKKwkJcmV0dXJuIDA7CisJR1RfUkVHX1JFQUQgKHNpemVSZWcsICZzaXplKTsKKwlzaXplID0gKChzaXplIDw8IDE2KSB8IDB4ZmZmZikgKyAxOworCXJldHVybiBzaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlHZXREZXZpY2VXaWR0aCAtIFJldHVybnMgdGhlIHdpZHRoIG9mIGEgZ2l2ZW4gZGV2aWNlLgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhlIE1WJ3MgZGV2aWNlIGludGVyZmFjZSBzdXBwb3J0cyB1cCB0byAzMiBCaXQgd2lkZSBkZXZpY2VzLiBBIGRldmljZQorKiAgICAgICBjYW4gaGF2ZSBhICAxLCAyLCA0IG9yIDggQnl0ZXMgZGF0YSB3aWR0aC4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorKiAgICAgICB3aWR0aCBvZiBhIGRldmljZSBhcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorKiBJTlBVVDoKKyogICAgICAgZGV2aWNlIC0gU2VsZWN0cyBvbmUgb2YgdGhlIGZpdmUgZGV2aWNlcyBhcyBkZWZpbmVkIGluIE1lbW9yeS5oLgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqIFJFVFVSTjoKKyogICAgICAgRGV2aWNlIHdpZHRoIGluIEJ5dGVzICgxLDIsNCBvciA4KSwgMCBpZiBlcnJvciBoYWQgb2NjdXJyZWQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZVdpZHRoIChERVZJQ0UgZGV2aWNlKQoreworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgcmVnVmFsdWU7CisKKwlHVF9SRUdfUkVBRCAoREVWSUNFX0JBTkswUEFSQU1FVEVSUyArIGRldmljZSAqIDQsICZyZWdWYWx1ZSk7CisJd2lkdGggPSAocmVnVmFsdWUgJiAoQklUMjAgfCBCSVQyMSkpID4+IDIwOworCXJldHVybiAoQklUMCA8PCB3aWR0aCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeU1hcEJhbmsgLSBTZXQgbmV3IGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBmb3Igb25lIG9mIHRoZSBtZW1vcnkKKyogICAgICAgICAgICAgICAgICAgICAgICAgYmFua3MuCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIG1hcCBjb25zaXN0cyBvZiAyMSBhZGRyZXNzIHdpbmRvd3MKKyogICAgICAgZm9yIHRoZSBkaWZmZXJlbnQgZGV2aWNlcyAoZS5nLiBDU1szOjBdICxQQ0kwIE1lbSAwLzEvMi8zLi4uKS4gRWFjaAorKiAgICAgICB3aW5kb3cgY2FuIGhhdmUgYSBtaW5pbXVtIG9mIDFNYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgYW5kIHVwIHRvIDRHYnl0ZQorKiAgICAgICBzcGFjZS4gRWFjaCBhZGRyZXNzIHdpbmRvdyBpcyBkZWZpbmVkIGJ5IHR3byByZWdpc3RlcnMgLSBiYXNlIGFuZCBzaXplLgorKiAgICAgICBUaGUgQ1BVIGFkZHJlc3MgaXMgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSB2YXJpb3VzIENQVSB3aW5kb3dzCisqICAgICAgIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgYW5kIHRoZSBhZGRyZXNzIGlzIHRoYW4gdGFyZ2V0ZWQgdG8gdGhhdCB3aW5kb3cuCisqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBuZXcgYmFzZSBhbmQgc2l6ZSBmb3Igb25lIHRoZSBtZW1vcnkgYmFua3MKKyogICAgICAgKENTMCAtIENTMykuIEl0IGlzIHRoZSBwcm9ncmFtbWVyYHMgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyogICAgICAgdGhlcmUgYXJlIG5vIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1lbW9yeSBzcGFjZXMuIFdoZW4gdHdvIG1lbW9yeSBzcGFjZXMKKyogICAgICAgb3ZlcmxhcCwgdGhlIE1WknMgYmVoYXZpb3IgaXMgbm90IGRlZmluZWQgLklmIGEgYmFuayBuZWVkcyB0byBiZSBjbG9zZWQsCisqICAgICAgIHNldCB0aGUgkmJhbmtMZW5ndGiSIHBhcmFtZXRlciBzaXplIHRvIDB4MC4KKyoKKyogSU5QVVQ6CisqICAgICAgIGJhbmsgICAgICAtIE9uZSBvZiB0aGUgbWVtb3J5IGJhbmtzIChDUzAtQ1MzKSBhcyBkZWZpbmVkIGluIGd0TWVtb3J5LmguCisqICAgICAgIGJhbmtCYXNlICAtIFRoZSBtZW1vcnkgYmFuayBiYXNlIGFkZHJlc3MuCisqICAgICAgIGJhbmtMZW5ndGggIC0gVGhlIG1lbW9yeSBiYW5rIHNpemUuIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWNyZW1lbnQgdGhlCisqICAgICAgICAgICAgICAgICAgICdiYW5rTGVuZ3RoJyBwYXJhbWV0ZXIgYnkgb25lIGFuZCB0aGVuIGNoZWNrIGlmIHRoZSBzaXplIGlzCisqICAgICAgICAgICAgICAgICAgIHZhbGlkLiBBIHZhbGlkIHNpemUgbXVzdCBiZSBwcm9ncmFtZWQgZnJvbSBMU0IgdG8gTVNCIGFzCisqICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIG9mIJExknMgZm9sbG93ZWQgYnkgc2VxdWVuY2Ugb2YgkTCScy4KKyogICAgICAgICAgICAgICAgICAgVG8gY2xvc2UgYSBtZW1vcnkgd2luZG93IHNpbXBseSBzZXQgdGhlIHNpemUgdG8gMC4KKyogICAgICBOT1RFISEhCisqICAgICAgIFRoZSBzaXplIG11c3QgYmUgaW4gNjRLYnl0ZSBncmFudWxhcml0eS4KKyogICAgICAgVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUuCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyogUkVUVVJOOgorKiAgICAgICBGYWxzZSBmb3IgaW52YWxpZCBzaXplLCB0cnVlIG90aGVyd2lzZS4KKyoKKyogQ0FVVElPTjogUENJX2Z1bmN0aW9ucyBtdXN0IGJlIGltcGxlbWVudGVkIGxhdGVyIFRvX2RvICEhISEhISEhISEhISEhISEhCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitib29sIG1lbW9yeU1hcEJhbmsgKE1FTU9SWV9CQU5LIGJhbmssIHVuc2lnbmVkIGludCBiYW5rQmFzZSwKKwkJICAgIHVuc2lnbmVkIGludCBiYW5rTGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBuZXdCYXNlLCBuZXdTaXplLCBiYXNlUmVnLCBzaXplUmVnLCB0ZW1wLCByU2hpZnQ7CisKKy8qICAgIFBDSV9JTlRFUk5BTF9CQVIgcGNpQkFSOyAqLworCisJc3dpdGNoIChiYW5rKSB7CisJY2FzZSBCQU5LMDoKKwkJYmFzZVJlZyA9IFNDU18wX0xPV19ERUNPREVfQUREUkVTUzsJLypDU18wX0JBU0VfQUREUjsgKi8KKwkJc2l6ZVJlZyA9IFNDU18wX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qQ1NfMF9TSVpFOyAqLworLyogICAgICAgIHBjaUJBUiA9IFBDSV9DUzBfQkFSOyAqLworCQlicmVhazsKKwljYXNlIEJBTksxOgorCQliYXNlUmVnID0gU0NTXzFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkNTXzFfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gU0NTXzFfSElHSF9ERUNPREVfQUREUkVTUzsJLypDU18xX1NJWkU7ICovCisJCS8qICAgICAgICBwY2lCQVIgPSBTQ1NfMF9ISUdIX0RFQ09ERV9BRERSRVNTOyAqLyAvKlBDSV9DUzFfQkFSOyAqLworCQlicmVhazsKKwljYXNlIEJBTksyOgorCQliYXNlUmVnID0gU0NTXzJfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkNTXzJfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gU0NTXzJfSElHSF9ERUNPREVfQUREUkVTUzsJLypDU18yX1NJWkU7ICovCisvKiAgICAgICAgcGNpQkFSID0gUENJX0NTMl9CQVI7Ki8KKwkJYnJlYWs7CisJY2FzZSBCQU5LMzoKKwkJYmFzZVJlZyA9IFNDU18zX0xPV19ERUNPREVfQUREUkVTUzsJLypDU18zX0JBU0VfQUREUjsgKi8KKwkJc2l6ZVJlZyA9IFNDU18zX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qQ1NfM19TSVpFOyAqLworLyogICAgICAgIHBjaUJBUiA9IFBDSV9DUzNfQkFSOyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qIElmIHRoZSBzaXplIGlzIDAsIHRoZSB3aW5kb3cgd2lsbCBiZSBkaXNhYmxlZCAqLworCWlmIChiYW5rTGVuZ3RoID09IDApIHsKKwkJTWVtb3J5RGlzYWJsZVdpbmRvdyAoQ1NfMF9XSU5ET1cgPDwgYmFuayk7CisJCS8qIERpc2FibGUgdGhlIEJBUiBmcm9tIHRoZSBQQ0kgc2xhdmUgc2lkZSAqLworLyogICAgICAgIGd0UGNpMERpc2FibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLworLyogICAgICAgIGd0UGNpMURpc2FibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUgKi8KKwlpZiAoKGJhbmtCYXNlICUgYmFua0xlbmd0aCkgIT0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChiYW5rTGVuZ3RoID49IE1JTklNVU1fTUVNX0JBTktfU0laRSkgeworCQluZXdCYXNlID0gYmFua0Jhc2UgPj4gMTY7CisJCW5ld1NpemUgPSBiYW5rTGVuZ3RoID4+IDE2OworCQkvKiBDaGVja2luZyB0aGF0IHRoZSBzaXplIGlzIGEgc2VxdWVuY2Ugb2YgJzEnIGZvbGxvd2VkIGJ5IGEKKwkJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KKwkJdGVtcCA9IG5ld1NpemUgLSAxOworCQlmb3IgKHJTaGlmdCA9IDA7IHJTaGlmdCA8IDE2OyByU2hpZnQrKykgeworCQkJdGVtcCA9IHRlbXAgPj4gclNoaWZ0OworCQkJaWYgKCh0ZW1wICYgMHgxKSA9PSAwKSB7CS8qIEVpdGhlciB3ZSBnb3QgdG8gdGhlIGxhc3QgJzEnICovCisJCQkJCQkJLyogb3IgdGhlIHNpemUgaXMgbm90IHZhbGlkCSAqLworCQkJCWlmICh0ZW1wID4gMHgwKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmZGVmIERFQlVHCisJCXsKKwkJCXVuc2lnbmVkIGludCBvbGRCYXNlLCBvbGRTaXplOworCisJCQlHVF9SRUdfUkVBRCAoYmFzZVJlZywgJm9sZEJhc2UpOworCQkJR1RfUkVHX1JFQUQgKHNpemVSZWcgKyA4LCAmb2xkU2l6ZSk7CisKKwkJCXByaW50ZiAoImIlZCBCYXNlOiV4IFNpemU6JXggLT4gQmFzZToleCBTaXplOiV4XG4iLAorCQkJCWJhbmssIG9sZEJhc2UsIG9sZFNpemUsIG5ld0Jhc2UsIG5ld1NpemUpOworCQl9CisjZW5kaWYKKwkJLyogd3JpdGluZyB0aGUgbmV3IHZhbHVlcyAqLworCQlHVF9SRUdfV1JJVEUgKGJhc2VSZWcsIG5ld0Jhc2UpOworCQlHVF9SRUdfV1JJVEUgKHNpemVSZWcsIG5ld1NpemUgLSAxKTsKKwkJLyogRW5hYmxlIGJhY2sgdGhlIHdpbmRvdyAqLworCQlNZW1vcnlFbmFibGVXaW5kb3cgKENTXzBfV0lORE9XIDw8IGJhbmspOworCQkvKiBFbmFibGUgdGhlIEJBUiBmcm9tIHRoZSBQQ0kgc2xhdmUgc2lkZSAqLworLyogICAgICAgIGd0UGNpMEVuYWJsZUludGVybmFsQkFSKHBjaUJBUik7ICovCisvKiAgICAgICAgZ3RQY2kxRW5hYmxlSW50ZXJuYWxCQVIocGNpQkFSKTsgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlNYXBEZXZpY2VTcGFjZSAtIFNldCBuZXcgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGZvciBvbmUgb2YgdGhlIGRldmljZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MuCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIG1hcCBjb25zaXN0cyBvZiAyMSBhZGRyZXNzIHdpbmRvd3MKKyogICAgICAgZm9yIHRoZSBkaWZmZXJlbnQgZGV2aWNlcyAoZS5nLiBDU1szOjBdICxQQ0kwIE1lbSAwLzEvMi8zLi4uKS4gRWFjaAorKiAgICAgICB3aW5kb3cgY2FuIGhhdmUgYSBtaW5pbXVtIG9mIDFNYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgYW5kIHVwIHRvIDRHYnl0ZQorKiAgICAgICBzcGFjZS4gRWFjaCBhZGRyZXNzIHdpbmRvdyBpcyBkZWZpbmVkIGJ5IHR3byByZWdpc3RlcnMgLSBiYXNlIGFuZCBzaXplLgorKiAgICAgICBUaGUgQ1BVIGFkZHJlc3MgaXMgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSB2YXJpb3VzIENQVSB3aW5kb3dzCisqICAgICAgIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgYW5kIHRoZSBhZGRyZXNzIGlzIHRoYW4gdGFyZ2V0ZWQgdG8gdGhhdCB3aW5kb3cuCisqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBuZXcgYmFzZSBhbmQgc2l6ZSBmb3Igb25lIHRoZSBkZXZpY2Ugd2luZG93cworKiAgICAgICAoREVWX0NTMCAtIERFVl9DUzMpLiBJdCBpcyB0aGUgcHJvZ3JhbW1lcmBzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZQorKiAgICAgICB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBtZW1vcnkgc3BhY2VzLiBXaGVuIHR3byBtZW1vcnkKKyogICAgICAgc3BhY2VzIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIC5JZiBhIGRldmljZSB3aW5kb3cKKyogICAgICAgbmVlZHMgdG8gYmUgY2xvc2VkLCBzZXQgdGhlICdkZXZpY2VMZW5ndGgnIHBhcmFtZXRlciBzaXplIHRvIDB4MC4KKyoKKyogSU5QVVQ6CisqICAgICAgIGRldmljZSAgICAgICAgICAgLSBPbmUgb2YgdGhlIGRldmljZSB3aW5kb3dzIChERVZfQ1MwLURFVl9DUzMpIGFzCisqICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIGd0TWVtb3J5LmguCisqICAgICAgIGRldmljZUJhc2UgLSBUaGUgZGV2aWNlIHdpbmRvdyBiYXNlIGFkZHJlc3MuCisqICAgICAgIGRldmljZUxlbmd0aCAtIFRoZSBkZXZpY2Ugd2luZG93IHNpemUuIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWNyZW1lbnQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAnZGV2aWNlTGVuZ3RoJyBwYXJhbWV0ZXIgYnkgb25lIGFuZCB0aGVuCisqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayBpZiB0aGUgc2l6ZSBpcyB2YWxpZC4gQSB2YWxpZCBzaXplIG11c3QgYmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1lZCBmcm9tIExTQiB0byBNU0IgYXMgc2VxdWVuY2Ugb2YgkTGScworKiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgc2VxdWVuY2Ugb2YgkTCScy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGNsb3NlIGEgbWVtb3J5IHdpbmRvdyBzaW1wbHkgc2V0IHRoZSBzaXplIHRvIDAuCisqCisqICAgICAgTk9URSEhIQorKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCisqICAgICAgIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzaXplLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgRmFsc2UgZm9yIGludmFsaWQgc2l6ZSwgdHJ1ZSBvdGhlcndpc2UuCisqCisqIENBVVRJT046IFBDSV9mdW5jdGlvbnMgbXVzdCBiZSBpbXBsZW1lbnRlZCBsYXRlciBUb19kbyAhISEhISEhISEhISEhISEhIQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYm9vbCBtZW1vcnlNYXBEZXZpY2VTcGFjZSAoREVWSUNFIGRldmljZSwgdW5zaWduZWQgaW50IGRldmljZUJhc2UsCisJCQkgICB1bnNpZ25lZCBpbnQgZGV2aWNlTGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBuZXdCYXNlLCBuZXdTaXplLCBiYXNlUmVnLCBzaXplUmVnLCB0ZW1wLCByU2hpZnQ7CisKKy8qICAgIFBDSV9JTlRFUk5BTF9CQVIgcGNpQkFSOyovCisKKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgREVWSUNFMDoKKwkJYmFzZVJlZyA9IENTXzBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzBfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gQ1NfMF9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzBfU0laRTsgKi8KKy8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTMF9CQVI7ICovCisJCWJyZWFrOworCWNhc2UgREVWSUNFMToKKwkJYmFzZVJlZyA9IENTXzFfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzFfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gQ1NfMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzFfU0laRTsgKi8KKy8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTMV9CQVI7ICovCisJCWJyZWFrOworCWNhc2UgREVWSUNFMjoKKwkJYmFzZVJlZyA9IENTXzJfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzJfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzJfU0laRTsgKi8KKy8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTMl9CQVI7ICovCisJCWJyZWFrOworCWNhc2UgREVWSUNFMzoKKwkJYmFzZVJlZyA9IENTXzNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzNfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gQ1NfM19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKkRFVl9DUzNfU0laRTsgKi8KKy8qICAgICAgICBwY2lCQVIgPSBQQ0lfREVWX0NTM19CQVI7ICovCisJCWJyZWFrOworCWNhc2UgQk9PVF9ERVZJQ0U6CisJCWJhc2VSZWcgPSBCT09UQ1NfTE9XX0RFQ09ERV9BRERSRVNTOwkvKkJPT1RDU19CQVNFX0FERFI7ICovCisJCXNpemVSZWcgPSBCT09UQ1NfSElHSF9ERUNPREVfQUREUkVTUzsJLypCT09UQ1NfU0laRTsgKi8KKy8qICAgICAgICBwY2lCQVIgPSBQQ0lfQk9PVF9DU19CQVI7ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGRldmljZUxlbmd0aCA9PSAwKSB7CisJCU1lbW9yeURpc2FibGVXaW5kb3cgKERFVkNTXzBfV0lORE9XIDw8IGRldmljZSk7CisJCS8qIERpc2FibGUgdGhlIEJBUiBmcm9tIHRoZSBQQ0kgc2xhdmUgc2lkZSAqLworLyogICAgICAgIGd0UGNpMERpc2FibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLworLyogICAgICAgIGd0UGNpMURpc2FibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUgKi8KKwlpZiAoKGRldmljZUJhc2UgJSBkZXZpY2VMZW5ndGgpICE9IDApIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoZGV2aWNlTGVuZ3RoID49IE1JTklNVU1fREVWSUNFX1dJTkRPV19TSVpFKSB7CisJCW5ld0Jhc2UgPSBkZXZpY2VCYXNlID4+IDE2OworCQluZXdTaXplID0gZGV2aWNlTGVuZ3RoID4+IDE2OworCQkvKiBDaGVja2luZyB0aGF0IHRoZSBzaXplIGlzIGEgc2VxdWVuY2Ugb2YgJzEnIGZvbGxvd2VkIGJ5IGEKKwkJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KKwkJdGVtcCA9IG5ld1NpemUgLSAxOworCQlmb3IgKHJTaGlmdCA9IDA7IHJTaGlmdCA8IDE2OyByU2hpZnQrKykgeworCQkJdGVtcCA9IHRlbXAgPj4gclNoaWZ0OworCQkJaWYgKCh0ZW1wICYgMHgxKSA9PSAwKSB7CS8qIEVpdGhlciB3ZSBnb3QgdG8gdGhlIGxhc3QgJzEnICovCisJCQkJCQkJLyogb3IgdGhlIHNpemUgaXMgbm90IHZhbGlkICAgICAgICovCisJCQkJaWYgKHRlbXAgPiAweDApCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIHdyaXRpbmcgdGhlIG5ldyB2YWx1ZXMgKi8KKwkJR1RfUkVHX1dSSVRFIChiYXNlUmVnLCBuZXdCYXNlKTsKKwkJR1RfUkVHX1dSSVRFIChzaXplUmVnLCBuZXdTaXplIC0gMSk7CisJCU1lbW9yeUVuYWJsZVdpbmRvdyAoREVWQ1NfMF9XSU5ET1cgPDwgZGV2aWNlKTsKKwkJLyogRW5hYmxlIHRoZSBCQVIgZnJvbSB0aGUgUENJIHNsYXZlIHNpZGUgKi8KKy8qICAgICAgICBndFBjaTBFbmFibGVJbnRlcm5hbEJBUihwY2lCQVIpOyAqLworLyogICAgICAgIGd0UGNpMUVuYWJsZUludGVybmFsQkFSKHBjaUJBUik7ICovCisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE1lbW9yeVNldFBjaVdpbmRvdyAtIFNldCBuZXcgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGZvciBvbmUgb2YgdGhlIFBDSQorKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MuCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIG1hcCBjb25zaXN0cyBvZiAyMSBhZGRyZXNzIHdpbmRvd3MKKyogICAgICAgZm9yIHRoZSBkaWZmZXJlbnQgZGV2aWNlcyAoZS5nLiBDU1szOjBdICxQQ0kwIE1lbSAwLzEvMi8zLi4uKS4gRWFjaAorKiAgICAgICB3aW5kb3cgY2FuIGhhdmUgYSBtaW5pbXVtIG9mIDFNYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgYW5kIHVwIHRvIDRHYnl0ZQorKiAgICAgICBzcGFjZS4gRWFjaCBhZGRyZXNzIHdpbmRvdyBpcyBkZWZpbmVkIGJ5IHR3byByZWdpc3RlcnMgLSBiYXNlIGFuZCBzaXplLgorKiAgICAgICBUaGUgQ1BVIGFkZHJlc3MgaXMgY29tcGFyZWQgd2l0aCB0aGUgdmFsdWVzIGluIHRoZSB2YXJpb3VzIENQVSB3aW5kb3dzCisqICAgICAgIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgYW5kIHRoZSBhZGRyZXNzIGlzIHRoYW4gdGFyZ2V0ZWQgdG8gdGhhdCB3aW5kb3cuCisqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBuZXcgYmFzZSBhbmQgc2l6ZSBmb3Igb25lIHRoZSBQQ0kgd2luZG93cworKiAgICAgICAoUENJIG1lbW9yeTAvMS8yLi4pLiBJdCBpcyB0aGUgcHJvZ3JhbW1lcmBzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZQorKiAgICAgICB0aGF0IHRoZXJlIGFyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBtZW1vcnkgc3BhY2VzLiBXaGVuIHR3byBtZW1vcnkKKyogICAgICAgc3BhY2VzIG92ZXJsYXAsIHRoZSBNVpJzIGJlaGF2aW9yIGlzIG5vdCBkZWZpbmVkIC5JZiBhIFBDSSB3aW5kb3cKKyogICAgICAgbmVlZHMgdG8gYmUgY2xvc2VkLCBzZXQgdGhlICdwY2lXaW5kb3dTaXplJyBwYXJhbWV0ZXIgc2l6ZSB0byAweDAuCisqCisqIElOUFVUOgorKiAgICAgICBwY2lXaW5kb3cgICAgIC0gT25lIG9mIHRoZSBQQ0kgd2luZG93cyBhcyBkZWZpbmVkIGluIGd0TWVtb3J5LmguCisqICAgICAgIHBjaVdpbmRvd0Jhc2UgLSBUaGUgUENJIHdpbmRvdyBiYXNlIGFkZHJlc3MuCisqICAgICAgIHBjaVdpbmRvd1NpemUgLSBUaGUgUENJIHdpbmRvdyBzaXplLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGVjcmVtZW50IHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgJ3BjaVdpbmRvd1NpemUnIHBhcmFtZXRlciBieSBvbmUgYW5kIHRoZW4gY2hlY2sgaWYgdGhlCisqICAgICAgICAgICAgICAgICAgICAgICBzaXplIGlzIHZhbGlkLiBBIHZhbGlkIHNpemUgbXVzdCBiZSBwcm9ncmFtZWQgZnJvbSBMU0IKKyogICAgICAgICAgICAgICAgICAgICAgIHRvIE1TQiBhcyBzZXF1ZW5jZSBvZiCRMZJzIGZvbGxvd2VkIGJ5IHNlcXVlbmNlIG9mIJEwknMuCisqICAgICAgICAgICAgICAgICAgICAgICBUbyBjbG9zZSBhIG1lbW9yeSB3aW5kb3cgc2ltcGx5IHNldCB0aGUgc2l6ZSB0byAwLgorKgorKiAgICAgIE5PVEUhISEKKyogICAgICAgVGhlIHNpemUgbXVzdCBiZSBpbiA2NEtieXRlIGdyYW51bGFyaXR5LgorKiAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIEZhbHNlIGZvciBpbnZhbGlkIHNpemUsIHRydWUgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgbWVtb3J5U2V0UGNpV2luZG93IChQQ0lfTUVNX1dJTkRPVyBwY2lXaW5kb3csIHVuc2lnbmVkIGludCBwY2lXaW5kb3dCYXNlLAorCQkJIHVuc2lnbmVkIGludCBwY2lXaW5kb3dTaXplKQoreworCXVuc2lnbmVkIGludCBjdXJyZW50TG93LCBiYXNlQWRkclJlZywgc2l6ZVJlZywgdGVtcCwgclNoaWZ0OworCisJc3dpdGNoIChwY2lXaW5kb3cpIHsKKwljYXNlIFBDSV8wX0lPOgorCQliYXNlQWRkclJlZyA9IFBDSV8xSV9PX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9JT19CQVNFX0FERFI7ICovCisJCXNpemVSZWcgPSBQQ0lfMElfT19ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX0lPX1NJWkU7ICovCisJCWJyZWFrOworCWNhc2UgUENJXzBfTUVNMDoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfME1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTBfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gUENJXzBNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMF9TSVpFOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTE6CisJCWJhc2VBZGRyUmVnID0gUENJXzBNRU1PUlkxX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkxX0JBU0VfQUREUjsgKi8KKwkJc2l6ZVJlZyA9IFBDSV8wTUVNT1JZMV9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTFfU0laRTsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMF9NRU0yOgorCQliYXNlQWRkclJlZyA9IFBDSV8wTUVNT1JZMl9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZMl9CQVNFX0FERFI7ICovCisJCXNpemVSZWcgPSBQQ0lfME1FTU9SWTJfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMF9NRU1PUlkyX1NJWkU7ICovCisJCWJyZWFrOworCWNhc2UgUENJXzBfTUVNMzoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfME1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8wX01FTU9SWTNfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gUENJXzBNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzBfTUVNT1JZM19TSVpFOyAqLworCQlicmVhazsKKyNpZmRlZiBJTkNMVURFX1BDSV8xCisJY2FzZSBQQ0lfMV9JTzoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfMUlfT19MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfSU9fQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gUENJXzFJX09fSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9JT19TSVpFOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTA6CisJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkwX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkwX0JBU0VfQUREUjsgKi8KKwkJc2l6ZVJlZyA9IFBDSV8xTUVNT1JZMF9ISUdIX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTBfU0laRTsgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfMV9NRU0xOgorCQliYXNlQWRkclJlZyA9IFBDSV8xTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMV9CQVNFX0FERFI7ICAqLworCQlzaXplUmVnID0gUENJXzFNRU1PUlkxX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZMV9TSVpFOyAqLworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTI6CisJCWJhc2VBZGRyUmVnID0gUENJXzFNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkyX0JBU0VfQUREUjsgICovCisJCXNpemVSZWcgPSBQQ0lfMU1FTU9SWTJfSElHSF9ERUNPREVfQUREUkVTUzsJLypQQ0lfMV9NRU1PUlkyX1NJWkU7ICovCisJCWJyZWFrOworCWNhc2UgUENJXzFfTUVNMzoKKwkJYmFzZUFkZHJSZWcgPSBQQ0lfMU1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOwkvKlBDSV8xX01FTU9SWTNfQkFTRV9BRERSOyAqLworCQlzaXplUmVnID0gUENJXzFNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1M7CS8qUENJXzFfTUVNT1JZM19TSVpFOyAqLworCQlicmVhazsKKyNlbmRpZiAvKiBJTkNMVURFX1BDSV8xICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAocGNpV2luZG93U2l6ZSA9PSAwKSB7CisJCU1lbW9yeURpc2FibGVXaW5kb3cgKFBDSV8wX0lPX1dJTkRPVyA8PCBwY2lXaW5kb3cpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUgKi8KKwlpZiAoKHBjaVdpbmRvd0Jhc2UgJSBwY2lXaW5kb3dTaXplKSAhPSAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHBjaVdpbmRvd1NpemUgPj0gTUlOSU1VTV9QQ0lfV0lORE9XX1NJWkUpIHsKKwkJcGNpV2luZG93QmFzZSA+Pj0gMTY7CisJCXBjaVdpbmRvd1NpemUgPj49IDE2OworCQkvKiBDaGVja2luZyB0aGF0IHRoZSBzaXplIGlzIGEgc2VxdWVuY2Ugb2YgJzEnIGZvbGxvd2VkIGJ5IGEKKwkJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KKwkJdGVtcCA9IHBjaVdpbmRvd1NpemUgLSAxOworCQlmb3IgKHJTaGlmdCA9IDA7IHJTaGlmdCA8IDE2OyByU2hpZnQrKykgeworCQkJdGVtcCA9IHRlbXAgPj4gclNoaWZ0OworCQkJaWYgKCh0ZW1wICYgMHgxKSA9PSAwKSB7CS8qIEVpdGhlciB3ZSBnb3QgdG8gdGhlIGxhc3QgJzEnICovCisJCQkJCQkJLyogb3IgdGhlIHNpemUgaXMgbm90IHZhbGlkICAgICAgICovCisJCQkJaWYgKHRlbXAgPiAweDApCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCUdUX1JFR19XUklURSAoc2l6ZVJlZywgcGNpV2luZG93U2l6ZSAtIDEpOworCQlHVF9SRUdfUkVBRCAoYmFzZUFkZHJSZWcsICZjdXJyZW50TG93KTsKKwkJcGNpV2luZG93QmFzZSA9CisJCQkocGNpV2luZG93QmFzZSAmIDB4ZmZmZmYpIHwgKGN1cnJlbnRMb3cgJiAweGZmZjAwMDAwKTsKKwkJR1RfUkVHX1dSSVRFIChiYXNlQWRkclJlZywgcGNpV2luZG93QmFzZSk7CisJCU1lbW9yeUVuYWJsZVdpbmRvdyAoUENJXzBfSU9fV0lORE9XIDw8IHBjaVdpbmRvdyk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeU1hcEludGVybmFsUmVnaXN0ZXJzU3BhY2UgLSBTZXRzIG5ldyBiYXNlIGFkZHJlc3MgZm9yIHRoZSBpbnRlcm5hbAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcnMgbWVtb3J5IHNwYWNlLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBzZXQgbmV3IGJhc2UgYWRkcmVzcyBmb3IgdGhlIGludGVybmFsIHJlZ2lzdGVyknMgbWVtb3J5CisqICAgICAgIHNwYWNlICh0aGUgc2l6ZSBpcyBmaXhlZCBhbmQgY2Fubm90IGJlIG1vZGlmaWVkKS4gVGhlIGZ1bmN0aW9uIGRvZXMgbm90CisqICAgICAgIGhhbmRsZSBvdmVybGFwcGluZyB3aXRoIG90aGVyIG1lbW9yeSBzcGFjZXMsIGl0IGlzIHRoZSBwcm9ncmFtZXIncworKiAgICAgICByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBvdmVybGFwcGluZyBkb2VzIG5vdCBvY2N1ci4KKyogICAgICAgV2hlbiB0d28gbWVtb3J5IHNwYWNlcyBvdmVybGFwLCB0aGUgTVaScyBiZWhhdmlvciBpcyBub3QgZGVmaW5lZC4KKyoKKyogSU5QVVQ6CisqICAgICAgIGludGVybmFsUmVnQmFzZSAtIG5ldyBiYXNlIGFkZHJlc3MgZm9yIHRoZSBpbnRlcm5hbCByZWdpc3RlcpJzIG1lbW9yeQorKiAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgICB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWVtb3J5TWFwSW50ZXJuYWxSZWdpc3RlcnNTcGFjZSAtIFNldHMgbmV3IGJhc2UgYWRkcmVzcyBmb3IgdGhlIGludGVybmFscworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJzLgorKgorKiBJTlBVVFM6ICB1bnNpZ25lZCBpbnQgaW50ZXJuYWxSZWdCYXNlIC0gVGhlIG5ldyBiYXNlIGFkZHJlc3MuCisqIFJFVFVSTlM6IHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBtZW1vcnlNYXBJbnRlcm5hbFJlZ2lzdGVyc1NwYWNlICh1bnNpZ25lZCBpbnQgaW50ZXJuYWxSZWdCYXNlKQoreworCXVuc2lnbmVkIGludCBjdXJyZW50VmFsdWU7CisJdW5zaWduZWQgaW50IGludGVybmFsVmFsdWUgPSBpbnRlcm5hbFJlZ0Jhc2U7CisKKwlpbnRlcm5hbFJlZ0Jhc2UgPSAoaW50ZXJuYWxSZWdCYXNlID4+IDE2KTsKKwlHVF9SRUdfUkVBRCAoSU5URVJOQUxfU1BBQ0VfREVDT0RFLCAmY3VycmVudFZhbHVlKTsKKwlpbnRlcm5hbFJlZ0Jhc2UgPSAoY3VycmVudFZhbHVlICYgMHhmZjAwMDAwMCkgfCBpbnRlcm5hbFJlZ0Jhc2U7CisJR1RfUkVHX1dSSVRFIChJTlRFUk5BTF9TUEFDRV9ERUNPREUsIGludGVybmFsUmVnQmFzZSk7CisJLyogaW5pdGlhbGl6aW5nIGFsc28gdGhlIGdsb2JhbCB2YXJpYWJsZSAnaW50ZXJuYWxSZWdCYXNlQWRkcicgKi8KKy8qICAgIGd0SW50ZXJuYWxSZWdCYXNlQWRkciA9IGludGVybmFsVmFsdWU7ICovCisJSU5URVJOQUxfUkVHX0JBU0VfQUREUiA9IGludGVybmFsVmFsdWU7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeUdldEludGVybmFsUmVnaXN0ZXJzU3BhY2UgLSBSZXR1cm5zIHRoZSBpbnRlcm5hbCByZWdpc3RlcnMgQmFzZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgIHRoZSBpbnRlcm5hbCByZWdpc3RlcpJzCisqICAgICAgIG1lbW9yeSBzcGFjZSAuCisqCisqIElOUFVUOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgMzIgYml0IGJhc2UgYWRkcmVzcyBvZiB0aGUgaW50ZXJuYWwgcmVnaXN0ZXKScyBtZW1vcnkgc3BhY2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IG1lbW9yeUdldEludGVybmFsUmVnaXN0ZXJzU3BhY2UgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGN1cnJlbnRWYWx1ZSA9IDA7CisKKwlHVF9SRUdfUkVBRCAoSU5URVJOQUxfU1BBQ0VfREVDT0RFLCAmY3VycmVudFZhbHVlKTsKKwlyZXR1cm4gKChjdXJyZW50VmFsdWUgJiAweDAwMGZmZmZmKSA8PCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGd0TWVtb3J5R2V0SW50ZXJuYWxTcmFtQmFzZUFkZHIgLSBSZXR1cm5zIHRoZSBpbnRlZ3JhdGVkIFNSQU0gYmFzZSBhZGRyZXNzLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhlIEF0bGFudGlzIGluY29ycG9yYXRlIGludGVncmF0ZWQgMk1iaXQgU1JBTSBmb3IgZ2VuZXJhbCB1c2UuIFRoaXMKKyogICAgICAgZnVuY25pb24gcmV0dXJuIHRoZSBTUkFNJ3MgYmFzZSBhZGRyZXNzLgorKiBJTlBVVDoKKyogICAgICAgTm9uZS4KKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKiBSRVRVUk46CisqICAgICAgIDMyIGJpdCBTUkFNJ3MgYmFzZSBhZGRyZXNzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBtZW1vcnlHZXRJbnRlcm5hbFNyYW1CYXNlQWRkciAodm9pZCkKK3sKKwlyZXR1cm4gKChHVFJFR1JFQUQgKElOVEVHUkFURURfU1JBTV9CQVNFX0FERFIpICYgMHhmZmZmZikgPDwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBndE1lbW9yeVNldEludGVybmFsU3JhbUJhc2VBZGRyIC0gU2V0IHRoZSBpbnRlZ3JhdGVkIFNSQU0gYmFzZSBhZGRyZXNzLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhlIEF0bGFudGlzIGluY29ycG9yYXRlIGludGVncmF0ZWQgMk1iaXQgU1JBTSBmb3IgZ2VuZXJhbCB1c2UuIFRoaXMKKyogICAgICAgZnVuY3Rpb24gc2V0cyBhIG5ldyBiYXNlIGFkZHJlc3MgdG8gdGhlIFNSQU0gLgorKiBJTlBVVDoKKyogICAgICAgc3JhbUJhc2VBZGRyZXNzIC0gVGhlIFNSQU0ncyBiYXNlIGFkZHJlc3MuCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ3RNZW1vcnlTZXRJbnRlcm5hbFNyYW1CYXNlQWRkciAodW5zaWduZWQgaW50IHNyYW1CYXNlQWRkcmVzcykKK3sKKwlHVF9SRUdfV1JJVEUgKElOVEVHUkFURURfU1JBTV9CQVNFX0FERFIsIHNyYW1CYXNlQWRkcmVzcyA+PiAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeVNldFByb3RlY3RSZWdpb24gLSBTZXQgcHJvdGVjdGlvbiBtb2RlIGZvciBvbmUgb2YgdGhlIDggcmVnaW9ucy4KKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoZSBDUFUgaW50ZXJmYWNlIHN1cHBvcnRzIGNvbmZpZ3VyYWJsZSBhY2Nlc3MgcHJvdGVjdGlvbi4gVGhpcyBpbmNsdWRlcworKiAgICAgICB1cCB0byBlaWdodCBhZGRyZXNzIHJhbmdlcyBkZWZpbmVkIHRvIGEgZGlmZmVyZW50IHByb3RlY3Rpb24gdHlwZSA6CisqICAgICAgIHdoZXRoZXIgdGhlIGFkZHJlc3MgcmFuZ2UgaXMgY2FjaGVhYmxlIG9yIG5vdCwgd2hldGhlciBpdCBpcyB3cml0YWJsZSBvcgorKiAgICAgICBub3QgLCBhbmQgd2hldGhlciBpdCBpcyBhY2Nlc3NpYmxlIG9yIG5vdC4gQSBMb3cgYW5kIEhpZ2ggcmVnaXN0ZXJzCisqICAgICAgIGRlZmluZSBlYWNoIHdpbmRvdyB3aGlsZSB0aGUgbWluaW11bSBhZGRyZXNzIHJhbmdlIG9mIGVhY2ggd2luZG93IGlzCisqICAgICAgIDFNYnl0ZS4gQW4gYWRkcmVzcyBkcml2ZW4gYnkgdGhlIENQVSwgaW4gYWRkaXRpb24gdG8gdGhlIGFkZHJlc3MKKyogICAgICAgZGVjb2RpbmcgYW5kIHJlbWFwcGluZyBwcm9jZXNzLCBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSBlaWdodCBBY2Nlc3MKKyogICAgICAgUHJvdGVjdGlvbiBMb3cvSGlnaCByZWdpc3RlcnMgLCBpZiBhbiBhZGRyZXNzIG1hdGNoZXMgb25lIG9mIHRoZSB3aW5kb3dzCisqICAgICAgICwgdGhlIE1WIGRldmljZSBjaGVja3MgdGhlIHRyYW5zYWN0aW9uIHR5cGUgYWdhaW5zdCB0aGUgcHJvdGVjdGlvbiBiaXRzCisqICAgICAgIGRlZmluZWQgaW4gQ1BVIEFjY2VzcyBQcm90ZWN0aW9uIHJlZ2lzdGVyLCB0byBkZXRlcm1pbmUgaWYgdGhlIGFjY2VzcyBpcworKiAgICAgICBhbGxvd2VkLiBUaGlzIGZ1bmN0aW9uIHNldCBhIHByb3RlY3Rpb24gbW9kZSB0byBvbmUgb2YgdGhlIDggcG9zc2libGUKKyogICAgICAgcmVnaW9ucy4KKyogICAgICBOT1RFOgorKiAgICAgICBUaGUgQ1BVIGFkZHJlc3Mgd2luZG93cyBhcmUgcmVzdHJpY3RlZCB0byBhIHNpemUgb2YgIDIgcG93ZXIgbiBhbmQgdGhlCisqICAgICAgIHN0YXJ0IGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSB3aW5kb3cgc2l6ZS4gRm9yIGV4YW1wbGUsIGlmIHVzaW5nCisqICAgICAgIGEgMTYgTUIgd2luZG93LCB0aGUgc3RhcnQgYWRkcmVzcyBiaXRzIFsyMzowXSBtdXN0IGJlIDAuVGhlIE1WJ3MKKyogICAgICAgaW50ZXJuYWwgcmVnaXN0ZXJzIHNwYWNlIGlzIG5vdCBwcm90ZWN0ZWQsIGV2ZW4gaWYgdGhlIGFjY2VzcyBwcm90ZWN0aW9uCisqICAgICAgIHdpbmRvd3MgY29udGFpbiB0aGlzIHNwYWNlLgorKgorKiBJTlBVVDoKKyogICAgICAgcmVnaW9uIC0gc2VsZWN0cyB3aGljaCByZWdpb24gdG8gYmUgY29uZmlndXJlZC4gVGhlIHZhbHVlcyBkZWZpbmVkIGluCisqICAgICAgICAgICAgICAgIGd0TWVtb3J5Lmg6CisqCisqICAgICAgICAgICAgICAgICAtIE1FTV9SRUdJT04wCisqICAgICAgICAgICAgICAgICAtIE1FTV9SRUdJT04xCisqICAgICAgICAgICAgICAgICAtIGV0Yy4KKyoKKyogICAgICAgbWVtQWNjZXNzIC0gQWxsb3dzIG9yIGZvcmJpZHMgYWNjZXNzIChyZWFkIG9yIHdyaXRlICkgdG8gdGhlIHJlZ2lvbi4gVGhlCisqICAgICAgICAgICAgICAgICAgIHZhbHVlcyBkZWZpbmVkIGluIGd0TWVtb3J5Lmg6CisqCisqICAgICAgICAgICAgICAgICAgICAtIE1FTV9BQ0NFU1NfQUxMT1dFRAorKiAgICAgICAgICAgICAgICAgICAgLSBNRU1fQUNDRVNTX0ZPUkJJREVOCisqCisqICAgICAgIG1lbVdyaXRlIC0gQ1BVIHdyaXRlIHByb3RlY3Rpb24gdG8gdGhlIHJlZ2lvbi4gVGhlIHZhbHVlcyBkZWZpbmVkIGluCisqICAgICAgICAgICAgICAgICAgZ3RNZW1vcnkuaDoKKyoKKyogICAgICAgICAgICAgICAgICAgLSBNRU1fV1JJVEVfQUxMT1dFRAorKiAgICAgICAgICAgICAgICAgICAtIE1FTV9XUklURV9GT1JCSURFTgorKgorKiAgICAgICBjYWNoZVByb3RlY3Rpb24gLSBEZWZpbmVzIHdoZXRoZXIgY2FjaGluZyB0aGUgcmVnaW9uIGlzIGFsbG93ZWQgb3Igbm90LgorKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGRlZmluZWQgaW4gZ3RNZW1vcnkuaDoKKyoKKyogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTUVNX0NBQ0hFX0FMTE9XRUQKKyogICAgICAgICAgICAgICAgICAgICAgICAgIC0gTUVNX0NBQ0hFX0ZPUkJJREVOCisqCisqICAgICAgIGJhc2VBZGRyZXNzIC0gdGhlIHJlZ2lvbidzIGJhc2UgQWRkcmVzcy4KKyogICAgICAgcmVnaW9uU2l6ZSAgLSBUaGUgcmVnaW9uJ3Mgc2l6ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGRlY3JlbWVudCB0aGUKKyogICAgICAgICAgICAgICAgICAgICAncmVnaW9uU2l6ZScgcGFyYW1ldGVyIGJ5IG9uZSBhbmQgdGhlbiBjaGVjayBpZiB0aGUgc2l6ZQorKiAgICAgICAgICAgICAgICAgICAgIGlzIHZhbGlkLiBBIHZhbGlkIHNpemUgbXVzdCBiZSBwcm9ncmFtZWQgZnJvbSBMU0IgdG8gTVNCCisqICAgICAgICAgICAgICAgICAgICAgYXMgc2VxdWVuY2Ugb2YgkTGScyBmb2xsb3dlZCBieSBzZXF1ZW5jZSBvZiCRMJJzLgorKiAgICAgICAgICAgICAgICAgICAgIFRvIGNsb3NlIGEgbWVtb3J5IHdpbmRvdyBzaW1wbHkgc2V0IHRoZSBzaXplIHRvIDAuCisqCisqICAgICAgTk9URSEhIQorKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCisqICAgICAgIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzaXplLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgRmFsc2UgZm9yIGludmFsaWQgc2l6ZSwgdHJ1ZSBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBtZW1vcnlTZXRQcm90ZWN0UmVnaW9uIChNRU1PUllfUFJPVEVDVF9XSU5ET1cgd2luZG93LAorCQkJICAgICBNRU1PUllfQUNDRVNTIG1lbUFjY2VzcywKKwkJCSAgICAgTUVNT1JZX0FDQ0VTU19XUklURSBtZW1Xcml0ZSwKKwkJCSAgICAgTUVNT1JZX0NBQ0hFX1BST1RFQ1QgY2FjaGVQcm90ZWN0aW9uLAorCQkJICAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCBkYXRhRm9yUmVnLCB0ZW1wLCByU2hpZnQ7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCUdUX1JFR19XUklURSAoKENQVV9QUk9URUNUX1dJTkRPV18wX1NJWkUgKyAweDEwICogd2luZG93KSwKKwkJCSAgICAgIDB4MCk7CisJCXJldHVybiB0cnVlOworCX0KKwkvKiBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4gICovCisJaWYgKGJhc2VBZGRyZXNzICUgc2l6ZSAhPSAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHNpemUgPj0gTUlOSU1VTV9BQ0NFU1NfV0lOX1NJWkUpIHsKKwkJYmFzZUFkZHJlc3MgPSAoKGJhc2VBZGRyZXNzID4+IDE2KSAmIDB4ZmZmZmYpOworCQlkYXRhRm9yUmVnID0gYmFzZUFkZHJlc3MgfCAoKG1lbUFjY2VzcyA8PCAyMCkgJiBCSVQyMCkgfAorCQkJKChtZW1Xcml0ZSA8PCAyMSkgJiBCSVQyMSkgfCAoKGNhY2hlUHJvdGVjdGlvbiA8PCAyMikKKwkJCQkJCSAgICAgICYgQklUMjIpIHwgQklUMzE7CisJCUdUX1JFR19XUklURSAoQ1BVX1BST1RFQ1RfV0lORE9XXzBfQkFTRV9BRERSICsgMHgxMCAqIHdpbmRvdywKKwkJCSAgICAgIGRhdGFGb3JSZWcpOworCQlzaXplID4+PSAxNjsKKwkJLyogQ2hlY2tpbmcgdGhhdCB0aGUgc2l6ZSBpcyBhIHNlcXVlbmNlIG9mICcxJyBmb2xsb3dlZCBieSBhCisJCSAgIHNlcXVlbmNlIG9mICcwJyBzdGFydGluZyBmcm9tIExTQiB0byBNU0IuICovCisJCXRlbXAgPSBzaXplIC0gMTsKKwkJZm9yIChyU2hpZnQgPSAwOyByU2hpZnQgPCAxNjsgclNoaWZ0KyspIHsKKwkJCXRlbXAgPSB0ZW1wID4+IHJTaGlmdDsKKwkJCWlmICgodGVtcCAmIDB4MSkgPT0gMCkgewkvKiBFaXRoZXIgd2UgZ290IHRvIHRoZSBsYXN0ICcxJyAqLworCQkJCQkJCS8qIG9yIHRoZSBzaXplIGlzIG5vdCB2YWxpZCAgICAgICAqLworCQkJCWlmICh0ZW1wID4gMHgwKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlHVF9SRUdfV1JJVEUgKChDUFVfUFJPVEVDVF9XSU5ET1dfMF9TSVpFICsgMHgxMCAqIHdpbmRvdyksCisJCQkgICAgICBzaXplIC0gMSk7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGd0TWVtb3J5RGlzYWJsZVByb3RlY3RSZWdpb24gLSBEaXNhYmxlIGEgcHJvdGVjdGVkIHdpbmRvdy4KKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSBhIHByb3RlY3RlZCB3aW5kb3cgc2V0IGJ5CisqICAgICAgICdndE1lbW9yeVNldFByb3RlY3RSZWdpb24nIGZ1bmN0aW9uLgorKgorKiBJTlBVVDoKKyogICAgICAgd2luZG93IC0gb25lIG9mIHRoZSA0IHdpbmRvd3MgKCBkZWZpbmVkIGluIGd0TWVtb3J5LmggKS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtZW1vcnlEaXNhYmxlUHJvdGVjdFJlZ2lvbiAoTUVNT1JZX1BST1RFQ1RfV0lORE9XIHdpbmRvdykKK3sKKwlSRVNFVF9SRUdfQklUUyAoKChDUFVfUFJPVEVDVF9XSU5ET1dfMF9CQVNFX0FERFIpICsgKDB4MTAgKiB3aW5kb3cpKSwKKwkJCUJJVDMxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWVtb3J5U2V0UGNpUmVtYXBWYWx1ZSAtIFNldCBhIHJlbWFwIHZhbHVlIHRvIGEgUENJIG1lbW9yeSBzcGFjZSB0YXJnZXQuCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgYWRkcmVzcyBkZWNvZGluZyBtZWNoYW5pc20sIHRoZSBDUFUgaGFzIGFuIGFkZHJlc3MKKyogICAgICAgcmVtYXBwaW5nIG1lY2hhbmlzbSB0byBiZSB1c2VkIGJ5IGV2ZXJ5IFBDSSBkZWNvZGluZyB3aW5kb3cuIEVhY2ggUENJCisqICAgICAgIHdpbmRvdyBjYW4gYmUgcmVtYXBlZCB0byBhIGRlc2lyZWQgYWRkcmVzcyB0YXJnZXQgYWNjb3JkaW5nIHRvIHRoZSByZW1hcAorKiAgICAgICB2YWx1ZSB3aXRoaW4gdGhlIHJlbWFwIHJlZ2lzdGVyLiBUaGUgYWRkcmVzcyByZW1hcHBpbmcgaXMgdXNlZnVsIHdoZW4gYQorKiAgICAgICBDUFUgYWRkcmVzcyByYW5nZSBtdXN0IGJlIHJlYWxsb2NhdGVkIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIG9uIHRoZQorKiAgICAgICBQQ0kgYnVzLiBBbHNvLCBpdCBlbmFibGVzIENQVSBhY2Nlc3MgdG8gYSBQQ0kgYWdlbnQgbG9jYXRlZCBhYm92ZSB0aGUKKyogICAgICAgNEdieXRlIHNwYWNlLiBPbiBzeXN0ZW0gYm9vdCwgZWFjaCBvZiB0aGUgUENJIG1lbW9yeSBzcGFjZXMgaXMgbWFwZWQgdG8KKyogICAgICAgYSBkZWZ1YWx0IHZhbHVlIChzZWUgQ1BVIGludGVyZmFjZSBzZWN0aW9uIGluIHRoZSBNViBzcGVjIGZvciB0aGUKKyogICAgICAgZGVmYXVsdCB2YWx1ZXMpLiBUaGUgcmVtYXAgbWVjaGFuaXNtIGRvZXMgbm90IGFsd2F5cyBwcm9kdWNlIHRoZSBkZXNpcmVkCisqICAgICAgIGFkZHJlc3Mgb24gdGhlIFBDSSBidXMgYmVjYXVzZSBvZiB0aGUgcmVtYXAgbWVjaGFuaXNtIHdheSBvZiB3b3JraW5nCisqICAgICAgICh0byBmdWxseSB1bmRlcnN0YW5kIHdoeSwgcGxlYXNlIHNlZSB0aGUgJ0FkZHJlc3MgUmVtYXBwaW5nJyBzZWN0aW9uIGluCisqICAgICAgIHRoZSBNVidzIHNwZWMpLiBUaGVyZWZvciwgdGhpcyBmdW5jdGlvbiBzZXRzIGEgZGVzaXJlZCByZW1hcCB2YWx1ZSB0bworKiAgICAgICBvbmUgb2YgdGhlIFBDSSBtZW1vcnkgd2luZG93cyBhbmQgcmV0dXJuIHRoZSBlZmZlY3RpdmUgYWRkcmVzcyB0aGF0CisqICAgICAgIHNob3VsZCBiZSB1c2VkIHdoZW4gZXhpdGluZyB0aGUgUENJIG1lbW9yeSB3aW5kb3cuIFlvdSBzaG91bGQgQUxXQVlTIHVzZQorKiAgICAgICB0aGUgcmV0dXJuZWQgdmFsdWUgYnkgdGhpcyBmdW5jdGlvbiB3aGVuIHJlbWFwcGluZyBhIFBDSSB3aW5kb3cgYW5kCisqICAgICAgIGV4aXRpbmcgaXQuIElmIGZvciBleGFtcGxlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgUENJMCBtZW1vcnkgMCBpcworKiAgICAgICAweDkwMDAwMDAwLCB0aGUgc2l6ZSBpcyAweDAzZmZmZmZmIGFuZCB0aGUgcmVtYXAgdmFsdWUgaXMgMHgxMTAwMDAwMCwKKyogICAgICAgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiAweDkxMDAwMDAwIHRoYXQgTVVTVAorKiAgICAgICBiZSB1c2VkIHRvIGV4aXQgdGhpcyBtZW1vcnkgd2luZG93IGluIG9yZGVyIHRvIGFjaGl2ZSB0aGUgZGVpc3JlZAorKiAgICAgICByZW1hcHBpbmcuCisqCisqIElOUFVUOgorKiAgICAgICBtZW1vcnlXaW5kb3cgICAtIE9uZSBvZiB0aGUgUENJIG1lbW9yeSB3aW5kb3dzIGFzIGRlZmluZWQgaW4gTWVtb3J5LmgKKyogICAgICAgcmVtYXBWYWx1ZUxvdyAgLSBUaGUgbG93IHJlbWFwIHZhbHVlLgorKiAgICAgICByZW1hcFZhbHVlSGlnaCAtIFRoZSBoaWdoIHJlbWFwIHZhbHVlLgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgVGhlIGVmZmVjdGl2ZSBiYXNlIGFkZHJlc3MgdG8gZXhpdCB0aGUgUENJLCBvciAweGZmZmZmZmZmIGlmIG9uZSBvZiB0aGUKKyogICAgICAgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMgb3IgdGhlIGVmZmVjdGl2ZSBiYXNlIGFkZHJlc3MgaXMgaGlnaGVyIHRoZSB0b3AKKyogICAgICAgZGVjb2RlIHZhbHVlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBtZW1vcnlTZXRQY2lSZW1hcFZhbHVlIChQQ0lfTUVNX1dJTkRPVyBtZW1vcnlXaW5kb3csCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVtYXBWYWx1ZUhpZ2gsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVtYXBWYWx1ZUxvdykKK3sKKwl1bnNpZ25lZCBpbnQgcGNpTWVtV2luZG93QmFzZUFkZHJSZWcgPSAwLCBiYXNlQWRkclZhbHVlID0gMDsKKwl1bnNpZ25lZCBpbnQgcGNpTWVtV2luZG93U2l6ZVJlZyA9IDAsIHdpbmRvd1NpemVWYWx1ZSA9IDA7CisJdW5zaWduZWQgaW50IGVmZmVjdGl2ZUJhc2VBZGRyZXNzLCByZW1hcFJlZ0xvdywgcmVtYXBSZWdIaWdoOworCisJLyogSW5pdGlhbGl6aW5nIHRoZSBiYXNlIGFuZCBzaXplIHZhcmlhYmxlcyBvZiB0aGUgUENJCisJICAgbWVtb3J5IHdpbmRvd3MgKi8KKwlzd2l0Y2ggKG1lbW9yeVdpbmRvdykgeworCWNhc2UgUENJXzBfSU86CisJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfSU9fQkFTRV9BRERSOworCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzBfSU9fU0laRTsKKwkJcmVtYXBSZWdMb3cgPSBQQ0lfMF9JT19BRERSX1JFTUFQOworCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMF9JT19BRERSX1JFTUFQOworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTA6CisJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfTUVNT1JZMF9CQVNFX0FERFI7CisJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMF9NRU1PUlkwX1NJWkU7CisJCXJlbWFwUmVnTG93ID0gUENJXzBfTUVNT1JZMF9MT1dfQUREUl9SRU1BUDsKKwkJcmVtYXBSZWdIaWdoID0gUENJXzBfTUVNT1JZMF9ISUdIX0FERFJfUkVNQVA7CisJCWJyZWFrOworCWNhc2UgUENJXzBfTUVNMToKKwkJcGNpTWVtV2luZG93QmFzZUFkZHJSZWcgPSBQQ0lfMF9NRU1PUlkxX0JBU0VfQUREUjsKKwkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8wX01FTU9SWTFfU0laRTsKKwkJcmVtYXBSZWdMb3cgPSBQQ0lfMF9NRU1PUlkxX0xPV19BRERSX1JFTUFQOworCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMF9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfMF9NRU0yOgorCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8wX01FTU9SWTJfQkFTRV9BRERSOworCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzBfTUVNT1JZMl9TSVpFOworCQlyZW1hcFJlZ0xvdyA9IFBDSV8wX01FTU9SWTJfTE9XX0FERFJfUkVNQVA7CisJCXJlbWFwUmVnSGlnaCA9IFBDSV8wX01FTU9SWTJfSElHSF9BRERSX1JFTUFQOworCQlicmVhazsKKwljYXNlIFBDSV8wX01FTTM6CisJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzBfTUVNT1JZM19CQVNFX0FERFI7CisJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMF9NRU1PUlkzX1NJWkU7CisJCXJlbWFwUmVnTG93ID0gUENJXzBfTUVNT1JZM19MT1dfQUREUl9SRU1BUDsKKwkJcmVtYXBSZWdIaWdoID0gUENJXzBfTUVNT1JZM19ISUdIX0FERFJfUkVNQVA7CisJCWJyZWFrOworI2lmZGVmIElOQ0xVREVfUENJXzEKKwljYXNlIFBDSV8xX0lPOgorCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8xX0lPX0JBU0VfQUREUjsKKwkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8xX0lPX1NJWkU7CisJCXJlbWFwUmVnTG93ID0gUENJXzFfSU9fQUREUl9SRU1BUDsKKwkJcmVtYXBSZWdIaWdoID0gUENJXzFfSU9fQUREUl9SRU1BUDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfMV9NRU0wOgorCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8xX01FTU9SWTBfQkFTRV9BRERSOworCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzFfTUVNT1JZMF9TSVpFOworCQlyZW1hcFJlZ0xvdyA9IFBDSV8xX01FTU9SWTBfTE9XX0FERFJfUkVNQVA7CisJCXJlbWFwUmVnSGlnaCA9IFBDSV8xX01FTU9SWTBfSElHSF9BRERSX1JFTUFQOworCQlicmVhazsKKwljYXNlIFBDSV8xX01FTTE6CisJCXBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnID0gUENJXzFfTUVNT1JZMV9CQVNFX0FERFI7CisJCXBjaU1lbVdpbmRvd1NpemVSZWcgPSBQQ0lfMV9NRU1PUlkxX1NJWkU7CisJCXJlbWFwUmVnTG93ID0gUENJXzFfTUVNT1JZMV9MT1dfQUREUl9SRU1BUDsKKwkJcmVtYXBSZWdIaWdoID0gUENJXzFfTUVNT1JZMV9ISUdIX0FERFJfUkVNQVA7CisJCWJyZWFrOworCWNhc2UgUENJXzFfTUVNMjoKKwkJcGNpTWVtV2luZG93QmFzZUFkZHJSZWcgPSBQQ0lfMV9NRU1PUlkxX0JBU0VfQUREUjsKKwkJcGNpTWVtV2luZG93U2l6ZVJlZyA9IFBDSV8xX01FTU9SWTFfU0laRTsKKwkJcmVtYXBSZWdMb3cgPSBQQ0lfMV9NRU1PUlkxX0xPV19BRERSX1JFTUFQOworCQlyZW1hcFJlZ0hpZ2ggPSBQQ0lfMV9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfMV9NRU0zOgorCQlwY2lNZW1XaW5kb3dCYXNlQWRkclJlZyA9IFBDSV8xX01FTU9SWTNfQkFTRV9BRERSOworCQlwY2lNZW1XaW5kb3dTaXplUmVnID0gUENJXzFfTUVNT1JZM19TSVpFOworCQlyZW1hcFJlZ0xvdyA9IFBDSV8xX01FTU9SWTNfTE9XX0FERFJfUkVNQVA7CisJCXJlbWFwUmVnSGlnaCA9IFBDSV8xX01FTU9SWTNfSElHSF9BRERSX1JFTUFQOworCQlicmVhazsKKyNlbmRpZiAvKiBJTkNMVURFX1BDSV8xICovCisJZGVmYXVsdDoKKwkJLyogUmV0cnVuIGFuIGludmFsaWQgZWZmZWN0aXZlIGJhc2UgYWRkcmVzcyAqLworCQlyZXR1cm4gMHhmZmZmZmZmZjsKKwl9CisJLyogV3JpdGluZyB0aGUgcmVtYXAgdmFsdWUgdG8gdGhlIHJlbWFwIHJlZ2lzZXJzICovCisJR1RfUkVHX1dSSVRFIChyZW1hcFJlZ0hpZ2gsIHJlbWFwVmFsdWVIaWdoKTsKKwlHVF9SRUdfV1JJVEUgKHJlbWFwUmVnTG93LCByZW1hcFZhbHVlTG93ID4+IDE2KTsKKwkvKiBSZWFkaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYmFzZSBhZGRyZXNzIGFuZCBzaXplIHJlZ2lzdGVycyAqLworCWJhc2VBZGRyVmFsdWUgPSBHVFJFR1JFQUQgKHBjaU1lbVdpbmRvd0Jhc2VBZGRyUmVnKSAmIDB4ZmZmZmY7CisJd2luZG93U2l6ZVZhbHVlID0gR1RSRUdSRUFEIChwY2lNZW1XaW5kb3dTaXplUmVnKSAmIDB4ZmZmZjsKKwkvKiBTdGFydCBjYWxjdWxhdGluZyB0aGUgZWZmZWN0aXZlIEJhc2UgQWRkcmVzcyAqLworCWVmZmVjdGl2ZUJhc2VBZGRyZXNzID0gYmFzZUFkZHJWYWx1ZSA8PCAxNjsKKwkvKiBUaGUgZWZmZWN0aXZlIGJhc2UgYWRkcmVzcyB3aWxsIGJlIGNvbWJpbmVkIGZyb20gdGhlIGNob3BwZWQgKGlmIGFueSkKKwkgICByZW1hcCB2YWx1ZSAoYWNjb3JkaW5nIHRvIHRoZSBzaXplIHZhbHVlIGFuZCByZW1hcCBtZWNoYW5pc20pIGFuZCB0aGUKKwkgICB3aW5kb3cncyBiYXNlIGFkZHJlc3MgKi8KKwllZmZlY3RpdmVCYXNlQWRkcmVzcyB8PQorCQkoKCh3aW5kb3dTaXplVmFsdWUgPDwgMTYpIHwgMHhmZmZmKSAmIHJlbWFwVmFsdWVMb3cpOworCS8qIElmIHRoZSBlZmZlY3RpdmVCYXNlQWRkcmVzcyBleGNlZWQgdGhlIHdpbmRvdyBib3VuZGFyaWVzIHJldHVybiBhbgorCSAgIGludmFsaWQgdmFsdWUuICovCisJaWYgKGVmZmVjdGl2ZUJhc2VBZGRyZXNzID4KKwkgICAgKChiYXNlQWRkclZhbHVlIDw8IDE2KSArICgod2luZG93U2l6ZVZhbHVlIDw8IDE2KSB8IDB4ZmZmZikpKQorCQlyZXR1cm4gMHhmZmZmZmZmZjsKKwlyZXR1cm4gZWZmZWN0aXZlQmFzZUFkZHJlc3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlTZXRSZWdpb25Tbm9vcE1vZGUgLSBUaGlzIGZ1bmN0aW9uIG1vZGlmeXMgb25lIG9mIHRoZSA0IHJlZ2lvbnMgd2hpY2gKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgQ2FjaGUgQ29oZXJlbmN5LgorKgorKgorKiBJbnB1dHM6IFNOT09QX1JFR0lPTiByZWdpb24gLSBPbmUgb2YgdGhlIGZvdXIgcmVnaW9ucy4KKyogICAgICAgICBTTk9PUF9UWVBFIHNub29wVHlwZSAtIFRoZXJlIGlzIGZvdXIgb3B0aW9uYWwgVHlwZXM6CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIE5vIFNub29wLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBTbm9vcCB0byBXVCByZWdpb24uCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIFNub29wIHRvIFdCIHJlZ2lvbi4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4gU25vb3AgJiBJbnZhbGlkYXRlIHRvIFdCIHJlZ2lvbi4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MgLSBCYXNlIEFkZHJlc3Mgb2YgdGhpcyByZWdpb24uCisqICAgICAgICAgdW5zaWduZWQgaW50IHRvcEFkZHJlc3MgLSBUb3AgQWRkcmVzcyBvZiB0aGlzIHJlZ2lvbi4KKyogUmV0dXJuczogZmFsc2UgaWYgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIHdyb25nIGFuZCB0cnVlIGVsc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGV2YjYyNjAgY29kZSAqLworI2lmIDAKK2Jvb2wgbWVtb3J5U2V0UmVnaW9uU25vb3BNb2RlKE1FTU9SWV9TTk9PUF9SRUdJT04gcmVnaW9uLAorCQkJICAgICAgTUVNT1JZX1NOT09QX1RZUEUgc25vb3BUeXBlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLAorCQkJICAgICAgdW5zaWduZWQgaW50IHJlZ2lvbkxlbmd0aCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgc25vb3BYYmFzZUFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IHNub29wWHRvcEFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IGRhdGE7CisgICAgdW5zaWduZWQgaW50IHNub29wSGlnaCA9IGJhc2VBZGRyZXNzICsgcmVnaW9uTGVuZ3RoOworCisgICAgaWYoIChyZWdpb24gPiBNRU1fU05PT1BfUkVHSU9OMykgfHwgKHNub29wVHlwZSA+IE1FTV9TTk9PUF9XQikgKQorCXJldHVybiBmYWxzZTsKKyAgICBzbm9vcFhiYXNlQWRkcmVzcyA9IFNOT09QX0JBU0VfQUREUkVTU18wICsgMHgxMCAqIHJlZ2lvbjsKKyAgICBzbm9vcFh0b3BBZGRyZXNzID0gU05PT1BfVE9QX0FERFJFU1NfMCArIDB4MTAgKiByZWdpb247CisJCQkJIGlmKHJlZ2lvbkxlbmd0aCA9PSAwKSAvKiBjbG9zaW5nIHRoZSByZWdpb24gKi8KKyAgICB7CisJR1RfUkVHX1dSSVRFKHNub29wWGJhc2VBZGRyZXNzLDB4MDAwMGZmZmYpOworCUdUX1JFR19XUklURShzbm9vcFh0b3BBZGRyZXNzLDApOworCXJldHVybiB0cnVlOworICAgIH0KKyAgICBiYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzICYgMHhmZmZmMDAwMDsKKyAgICBkYXRhID0gKGJhc2VBZGRyZXNzID4+IDE2KSB8IHNub29wVHlwZSA8PCAxNjsKKyAgICBHVF9SRUdfV1JJVEUoc25vb3BYYmFzZUFkZHJlc3MsZGF0YSk7CisgICAgc25vb3BIaWdoID0gKHNub29wSGlnaCAmIDB4ZmZmMDAwMDApID4+IDIwOworICAgIEdUX1JFR19XUklURShzbm9vcFh0b3BBZGRyZXNzLHNub29wSGlnaCAtIDEpOworICAgIHJldHVybiB0cnVlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlSZW1hcEFkZHJlc3MgLSBUaGlzIGZ1YmN0aW9uIHVzZWQgZm9yIGFkZHJlc3MgcmVtYXBwaW5nLgorKgorKgorKiBJbnB1dHM6IHJlZ09mZnNldDogcmVtYXAgcmVnaXN0ZXIKKyogICAgICAgICByZW1hcFZhbHVlIDoKKyogUmV0dXJuczogZmFsc2UgaWYgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGVycm9uZW91cyx0cnVlIG90aGVyd2lzZS4KKyoKKyogTm90IG5lZWRlZCBmdW5jdGlvbiBUb19kbyAhISEhCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIG1lbW9yeVJlbWFwQWRkcmVzcyAodW5zaWduZWQgaW50IHJlbWFwUmVnLCB1bnNpZ25lZCBpbnQgcmVtYXBWYWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWVGb3JSZWc7CisKKwl2YWx1ZUZvclJlZyA9IChyZW1hcFZhbHVlICYgMHhmZmYwMDAwMCkgPj4gMjA7CisJR1RfUkVHX1dSSVRFIChyZW1hcFJlZywgdmFsdWVGb3JSZWcpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlHZXREZXZpY2VQYXJhbSAtIEV4dHJhY3QgdGhlIGRldmljZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGRldmljZSBiYW5rCisqICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHJlZ2lzdGVyLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVG8gYWxsb3cgaW50ZXJmYWNpbmcgd2l0aCB2ZXJ5IHNsb3cgZGV2aWNlcyBhbmQgZmFzdCBzeW5jaHJvbm91cyBTUkFNcywKKyogICAgICAgZWFjaCBkZXZpY2UgY2FuIGJlIHByb2dyYW1lZCB0byBkaWZmZXJlbnQgdGltaW5nIHBhcmFtZXRlcnMuIEVhY2ggYmFuaworKiAgICAgICBoYXMgaXRzIG93biBwYXJhbWV0ZXJzIHJlZ2lzdGVyLiBCYW5rIHdpZHRoIGNhbiBiZSBwcm9ncmFtbWVkIHRvIDgsIDE2LAorKiAgICAgICBvciAzMi1iaXRzLiBCYW5rIHRpbWluZyBwYXJhbWV0ZXJzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHN1cHBvcnQKKyogICAgICAgZGlmZmVyZW50IGRldmljZSB0eXBlcyAoZS5nLiBTeW5jIEJ1cnN0IFNSQU0sIEZsYXNoICwgUk9NLCBJL08KKyogICAgICAgQ29udHJvbGxlcnMpLiBUaGUgTVYgYWxsb3dzIHlvdSB0byBzZXQgdGltaW5nIHBhcmFtZXRlcnMgYW5kIHdpZHRoIGZvcgorKiAgICAgICBlYWNoIGRldmljZSB0aHJvdWdoIHBhcmFtZXRlcnMgcmVnaXN0ZXIgLgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJlZCBmcm9tIHRoZSBEZXZpY2UgQmFuaworKiAgICAgICBwYXJhbWV0ZXJzIHJlZ2lzdGVyIGFuZCBmaWxscyB0aGUgZ2l2ZW4gJ2RldmljZVBhcmFtJyAoZGVmaW5lZCBpbgorKiAgICAgICBndE1lbW9yeS5oKSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVhZCBkYXRhLgorKgorKiBJTlBVVDoKKyogICAgICAgZGV2aWNlUGFyYW0gLSAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBERVZJQ0VfUEFSQU0gKGRlZmluZWQgaW4KKyogICAgICAgICAgICAgICAgICAgICAgTWVtb3J5LmgpLkZvciBkZXRhaWxzIGFib3V0IGVhY2ggc3RydWN0dXJlIGZpZWxkIHBsZWFzZQorKiAgICAgICAgICAgICAgICAgICAgICBzZWUgdGhlIGRldmljZSB0aW1pbmcgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIE1WCisqICAgICAgICAgICAgICAgICAgICAgIGRhdGFzaGVldC4KKyogICAgICAgZGV2aWNlTnVtICAtICAgU2VsZWN0IG9uIG9mIHRoZSBmaXZlIGRldmljZSBiYW5rcyAoZGVmaW5lZCBpbgorKiAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkuaCkgOgorKgorKiAgICAgICAgICAgICAgICAgICAgICAgLSBERVZJQ0UwCisqICAgICAgICAgICAgICAgICAgICAgICAtIERFVklDRTEKKyogICAgICAgICAgICAgICAgICAgICAgIC0gREVWSUNFMgorKiAgICAgICAgICAgICAgICAgICAgICAgLSBldGMuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBmYWxzZSBpZiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZXJyb25lb3VzLHRydWUgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtZW1vcnlHZXREZXZpY2VQYXJhbSAtIFRoaXMgZnVuY3Rpb24gdXNlZCBmb3IgZ2V0dGluZyBkZXZpY2UgcGFyYW1ldGVycyBmcm9tCisqICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFIEJBTksgUEFSQU1FVEVSUyBSRUdJU1RFUgorKgorKgorKiBJbnB1dHM6ICAgICAgICAtIGRldmljZVBhcmFtOiBTVFJVQ1Qgd2l0aCBwYXJhbWl0ZXJzIGZvciBERVZJQ0UgQkFOSworKiAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUlMgUkVHSVNURVIKKyogICAgICAgICAgICAgICAgLSBkZXZpY2VOdW0gOiBudW1iZXIgb2YgZGV2aWNlCisqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Jvb2wgbWVtb3J5R2V0RGV2aWNlUGFyYW0gKERFVklDRV9QQVJBTSAqIGRldmljZVBhcmFtLCBERVZJQ0UgZGV2aWNlTnVtKQoreworCXVuc2lnbmVkIGludCB2YWx1ZU9mUmVnOworCXVuc2lnbmVkIGludCBjYWxjRGF0YTsKKworCWlmIChkZXZpY2VOdW0gPiA0KQorCQlyZXR1cm4gZmFsc2U7CisJR1RfUkVHX1JFQUQgKERFVklDRV9CQU5LMFBBUkFNRVRFUlMgKyA0ICogZGV2aWNlTnVtLCAmdmFsdWVPZlJlZyk7CisJY2FsY0RhdGEgPSAoMHg3ICYgdmFsdWVPZlJlZykgKyAoKEJJVDIyICYgdmFsdWVPZlJlZykgPj4gMTkpOworCWRldmljZVBhcmFtLT50dXJuT2ZmID0gY2FsY0RhdGE7CS8qIFR1cm4gT2ZmICovCisKKwljYWxjRGF0YSA9ICgoMHg3OCAmIHZhbHVlT2ZSZWcpID4+IDMpICsgKChCSVQyMyAmIHZhbHVlT2ZSZWcpID4+IDE5KTsKKwlkZXZpY2VQYXJhbS0+YWNjMkZpcnN0ID0gY2FsY0RhdGE7CS8qIEFjY2VzcyBUbyBGaXJzdCAqLworCisJY2FsY0RhdGEgPSAoKDB4NzgwICYgdmFsdWVPZlJlZykgPj4gNykgKyAoKEJJVDI0ICYgdmFsdWVPZlJlZykgPj4gMjApOworCWRldmljZVBhcmFtLT5hY2MyTmV4dCA9IGNhbGNEYXRhOwkvKiBBY2Nlc3MgVG8gTmV4dCAqLworCisJY2FsY0RhdGEgPQorCQkoKDB4MzgwMCAmIHZhbHVlT2ZSZWcpID4+IDExKSArICgoQklUMjUgJiB2YWx1ZU9mUmVnKSA+PiAyMik7CisJZGV2aWNlUGFyYW0tPmFsZTJXciA9IGNhbGNEYXRhOwkvKiBBbGUgVG8gV3JpdGUgKi8KKworCWNhbGNEYXRhID0gKCgweDFjMDAwICYgdmFsdWVPZlJlZykgPj4gMTQpICsKKwkJKChCSVQyNiAmIHZhbHVlT2ZSZWcpID4+IDIzKTsKKwlkZXZpY2VQYXJhbS0+d3JMb3cgPSBjYWxjRGF0YTsJLyogV3JpdGUgQWN0aXZlICovCisKKwljYWxjRGF0YSA9ICgoMHhlMDAwMCAmIHZhbHVlT2ZSZWcpID4+IDE3KSArCisJCSgoQklUMjcgJiB2YWx1ZU9mUmVnKSA+PiAyNCk7CisJZGV2aWNlUGFyYW0tPndySGlnaCA9IGNhbGNEYXRhOwkvKiBXcml0ZSBIaWdoICovCisKKwljYWxjRGF0YSA9ICgoMHgzMDAwMDAgJiB2YWx1ZU9mUmVnKSA+PiAyMCk7CisJZGV2aWNlUGFyYW0tPmRldmljZVdpZHRoID0gKEJJVDAgPDwgY2FsY0RhdGEpOwkvKiBJbiBieXRlcyAqLworCWNhbGNEYXRhID0gKCgweDMwMDAwMDAwICYgdmFsdWVPZlJlZykgPj4gMjgpOworCWRldmljZVBhcmFtLT5iYWRyU2tldyA9IGNhbGNEYXRhOwkvKiBDeWNsZXMgZ2FwIGJldHdlZW4gQkFkcgorCQkJCQkJICAgdG9nZ2xlIHRvIHJlYWQgZGF0YSBzYW1wbGUuICovCisJY2FsY0RhdGEgPSAoKDB4NDAwMDAwMDAgJiB2YWx1ZU9mUmVnKSA+PiAzMCk7CisJZGV2aWNlUGFyYW0tPkRQRW4gPSBjYWxjRGF0YTsJLyogIERhdGEgUGFyaXR5IGVuYWJsZSAgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWVtb3J5U2V0RGV2aWNlUGFyYW0gLSBTZXQgbmV3IHBhcmFtZXRlcnMgZm9yIGEgZGV2aWNlLgorKgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVG8gYWxsb3cgaW50ZXJmYWNpbmcgd2l0aCB2ZXJ5IHNsb3cgZGV2aWNlcyBhbmQgZmFzdCBzeW5jaHJvbm91cyBTUkFNcywKKyogICAgICAgZWFjaCBkZXZpY2UgY2FuIGJlIHByb2dyYW1lZCB0byBkaWZmZXJlbnQgdGltaW5nIHBhcmFtZXRlcnMuIEVhY2ggYmFuaworKiAgICAgICBoYXMgaXRzIG93biBwYXJhbWV0ZXJzIHJlZ2lzdGVyLiBCYW5rIHdpZHRoIGNhbiBiZSBwcm9ncmFtbWVkIHRvIDgsIDE2LAorKiAgICAgICBvciAzMi1iaXRzLiBCYW5rIHRpbWluZyBwYXJhbWV0ZXJzIGNhbiBiZSBwcm9ncmFtbWVkIHRvIHN1cHBvcnQKKyogICAgICAgZGlmZmVyZW50IGRldmljZSB0eXBlcyAoZS5nLiBTeW5jIEJ1cnN0IFNSQU0sIEZsYXNoICwgUk9NLCBJL08KKyogICAgICAgQ29udHJvbGxlcnMpLiBUaGUgTVYgYWxsb3dzIHlvdSB0byBzZXQgdGltaW5nIHBhcmFtZXRlcnMgYW5kIHdpZHRoIGZvcgorKiAgICAgICBlYWNoIGRldmljZSB0aHJvdWdoIHBhcmFtZXRlcnMgcmVnaXN0ZXIuIFRoaXMgZnVuY3Rpb24gc2V0IG5ldworKiAgICAgICBwYXJhbWV0ZXJzIHRvIGEgZGV2aWNlIEJhbmsgZnJvbSB0aGUgZGVsaXZlcmVkIHN0cnVjdHVyZSAnZGV2aWNlUGFyYW0nCisqICAgICAgIChkZWZpbmVkIGluIGd0TWVtb3J5LmgpLiBUaGUgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBkYXRhCisqICAgICAgIHByaW9yIHRvIHRoZSB1c2Ugb2YgdGhlc2UgZnVuY3Rpb24uCisqCisqIElOUFVUOgorKiAgICAgICBkZXZpY2VQYXJhbSAtICBwb2ludGVyIHRvIGEgc3RydWN0dXJlIERFVklDRV9QQVJBTSAoZGVmaW5lZCBpbgorKiAgICAgICAgICAgICAgICAgICAgICBNZW1vcnkuaCkuRm9yIGRldGFpbHMgYWJvdXQgZWFjaCBzdHJ1Y3R1cmUgZmllbGQgcGxlYXNlCisqICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgZGV2aWNlIHRpbWluZyBwYXJhbWV0ZXIgc2VjdGlvbiBpbiB0aGUgTVYKKyogICAgICAgICAgICAgICAgICAgICAgZGF0YXNoZWV0LgorKiAgICAgICBkZXZpY2VOdW0gIC0gICBTZWxlY3Qgb24gb2YgdGhlIGZpdmUgZGV2aWNlIGJhbmtzIChkZWZpbmVkIGluCisqICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeS5oKSA6CisqCisqICAgICAgICAgICAgICAgICAgICAgICAtIERFVklDRTAKKyogICAgICAgICAgICAgICAgICAgICAgIC0gREVWSUNFMQorKiAgICAgICAgICAgICAgICAgICAgICAgLSBERVZJQ0UyCisqICAgICAgICAgICAgICAgICAgICAgICAtIGV0Yy4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1lbW9yeVNldERldmljZVBhcmFtIC0gVGhpcyBmdW5jdGlvbiB1c2VkIGZvciBzZXR0aW5nIGRldmljZSBwYXJhbWV0ZXJzIHRvCisqICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFIEJBTksgUEFSQU1FVEVSUyBSRUdJU1RFUgorKgorKgorKiBJbnB1dHM6ICAgICAgICAtIGRldmljZVBhcmFtOiBTVFJVQ1QgZm9yIHN0b3JlIHBhcmFtaXRlcnMgZnJvbSBERVZJQ0UgQkFOSworKiAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUlMgUkVHSVNURVIKKyogICAgICAgICAgICAgICAgLSBkZXZpY2VOdW0gOiBudW1iZXIgb2YgZGV2aWNlCisqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMsdHJ1ZSBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIG1lbW9yeVNldERldmljZVBhcmFtIChERVZJQ0VfUEFSQU0gKiBkZXZpY2VQYXJhbSwgREVWSUNFIGRldmljZU51bSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWVGb3JSZWc7CisKKwlpZiAoKGRldmljZVBhcmFtLT50dXJuT2ZmID4gMHg3KSB8fCAoZGV2aWNlUGFyYW0tPmFjYzJGaXJzdCA+IDB4ZikgfHwKKwkgICAgKGRldmljZVBhcmFtLT5hY2MyTmV4dCA+IDB4ZikgfHwgKGRldmljZVBhcmFtLT5hbGUyV3IgPiAweDcpIHx8CisJICAgIChkZXZpY2VQYXJhbS0+d3JMb3cgPiAweDcpIHx8IChkZXZpY2VQYXJhbS0+d3JIaWdoID4gMHg3KSB8fAorCSAgICAoZGV2aWNlUGFyYW0tPmJhZHJTa2V3ID4gMHgyKSB8fCAoZGV2aWNlUGFyYW0tPkRQRW4gPiAweDEpKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJdmFsdWVGb3JSZWcgPSAoKChkZXZpY2VQYXJhbS0+dHVybk9mZikgJiAweDcpIHwKKwkJICAgICAgICgoKGRldmljZVBhcmFtLT50dXJuT2ZmKSAmIDB4OCkgPDwgMTkpIHwKKwkJICAgICAgICgoKGRldmljZVBhcmFtLT5hY2MyRmlyc3QpICYgMHhmKSA8PCAzKSB8CisJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YWNjMkZpcnN0KSAmIDB4MTApIDw8IDE5KSB8CisJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YWNjMk5leHQpICYgMHhmKSA8PCA3KSB8CisJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YWNjMk5leHQpICYgMHgxMCkgPDwgMjApIHwKKwkJICAgICAgICgoKGRldmljZVBhcmFtLT5hbGUyV3IpICYgMHg3KSA8PCAxMSkgfAorCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPmFsZTJXcikgJiAweGYpIDw8IDIyKSB8CisJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+d3JMb3cpICYgMHg3KSA8PCAxNCkgfAorCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPndyTG93KSAmIDB4ZikgPDwgMjMpIHwKKwkJICAgICAgICgoKGRldmljZVBhcmFtLT53ckhpZ2gpICYgMHg3KSA8PCAxNykgfAorCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPndySGlnaCkgJiAweGYpIDw8IDI0KSB8CisJCSAgICAgICAoKChkZXZpY2VQYXJhbS0+YmFkclNrZXcpICYgMHgzKSA8PCAyOCkgfAorCQkgICAgICAgKCgoZGV2aWNlUGFyYW0tPkRQRW4pICYgMHgxKSA8PCAzMCkpOworCisJLyogaW5zZXJ0IHRoZSBkZXZpY2Ugd2lkdGg6ICovCisJc3dpdGNoIChkZXZpY2VQYXJhbS0+ZGV2aWNlV2lkdGgpIHsKKwljYXNlIDE6CisJCXZhbHVlRm9yUmVnID0gdmFsdWVGb3JSZWcgfCBfOEJJVDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl2YWx1ZUZvclJlZyA9IHZhbHVlRm9yUmVnIHwgXzE2QklUOworCQlicmVhazsKKwljYXNlIDQ6CisJCXZhbHVlRm9yUmVnID0gdmFsdWVGb3JSZWcgfCBfMzJCSVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlRm9yUmVnID0gdmFsdWVGb3JSZWcgfCBfOEJJVDsKKwkJYnJlYWs7CisJfQorCUdUX1JFR19XUklURSAoREVWSUNFX0JBTkswUEFSQU1FVEVSUyArIDQgKiBkZXZpY2VOdW0sIHZhbHVlRm9yUmVnKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTWVtb3J5RGlzYWJsZVdpbmRvdyAtIERpc2FibGUgYSBtZW1vcnkgc3BhY2UgYnkgdGhlIGRpc2FibGUgYml0LgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBvbmUgb2YgdGhlIDIxIGF2YWlsaWFibGUgd2luZG93cyBkZWRpY2F0ZWQgZm9yCisqICAgICAgIHRoZSBDUFUgZGVjb2RpbmcgbWVjaGFuaXNtLiBJdHMgcG9zc2libGUgdG8gY29tYmluZSBzZXZlcmFsIHdpbmRvd3Mgd2l0aAorKiAgICAgICB0aGUgT1IgY29tbWFuZC4KKyogSU5QVVQ6CisqICAgICAgIHdpbmRvdyAtIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgd2luZG93cyAoZGVmaW5lZCBpbiBndE1lbW9yeS5oKS4KKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNZW1vcnlEaXNhYmxlV2luZG93IChNRU1PUllfV0lORE9XIHdpbmRvdykKK3sKKwlTRVRfUkVHX0JJVFMgKEJBU0VfQUREUl9FTkFCTEUsIHdpbmRvdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE1lbW9yeUVuYWJsZVdpbmRvdyAtIEVuYWJsZSBhIG1lbW9yeSBzcGFjZSB0aGF0IHdhcyBkaXNhYmxlZCBieQorKiAgICAgICAgICAgICAgICAgICAgICAgJ01lbW9yeURpc2FibGVXaW5kb3cnLgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIG9uZSBvZiB0aGUgMjEgYXZhaWxpYWJsZSB3aW5kb3dzIGRlZGljYXRlZCBmb3IgdGhlCisqICAgICAgIENQVSBkZWNvZGluZyBtZWNoYW5pc20uIEl0cyBwb3NzaWJsZSB0byBjb21iaW5lIHNldmVyYWwgd2luZG93cyB3aXRoIHRoZQorKiAgICAgICBPUiBjb21tYW5kLgorKiBJTlBVVDoKKyogICAgICAgd2luZG93IC0gT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSB3aW5kb3dzIChkZWZpbmVkIGluIGd0TWVtb3J5LmgpLgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqIFJFVFVSTjoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE1lbW9yeUVuYWJsZVdpbmRvdyAoTUVNT1JZX1dJTkRPVyB3aW5kb3cpCit7CisJUkVTRVRfUkVHX0JJVFMgKEJBU0VfQUREUl9FTkFCTEUsIHdpbmRvdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE1lbW9yeUdldE1lbVdpbmRvd1N0YXR1cyAtIFRoaXMgZnVuY3Rpb24gY2hlY2sgd2hldGhlciB0aGUgbWVtb3J5IHdpbmRvdyBpcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIG9yIG5vdC4KKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBnaXZlbiBtZW1vcnkgd2luZG93IGlzIGNsb3NlZCAuCisqIElOUFVUOgorKiAgICAgICB3aW5kb3cgLSBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHdpbmRvd3MgKGRlZmluZWQgaW4gZ3RNZW1vcnkuaCkuCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyogUkVUVVJOOgorKiAgICAgICBUcnVlIGZvciBhIGNsb3NlZCB3aW5kb3csIGZhbHNlIG90aGVyd2lzZSAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTUVNT1JZX1dJTkRPV19TVEFUVVMgTWVtb3J5R2V0TWVtV2luZG93U3RhdHVzIChNRU1PUllfV0lORE9XIHdpbmRvdykKK3sKKwlpZiAoR1RSRUdSRUFEIChCQVNFX0FERFJfRU5BQkxFKSAmIHdpbmRvdykKKwkJcmV0dXJuIE1FTV9XSU5ET1dfRElTQUJMRUQ7CisJcmV0dXJuIE1FTV9XSU5ET1dfRU5BQkxFRDsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL21pc2MuUyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL21pc2MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWMzYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9jb21tb24vbWlzYy5TCkBAIC0wLDAgKzEsMjM1IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8NzR4eF83eHguaD4KKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorCisjaWZkZWYgQ09ORklHX0VDQworCS8qIEdhbGlsZW8gc3BlY2lmaWMgYXNtIGNvZGUgZm9yIGluaXRpYWxpemluZyBFQ0MgKi8KKwkuZ2xvYmwgYm9hcmRfcmVsb2NhdGVfcm9tCitib2FyZF9yZWxvY2F0ZV9yb206CisJbWZscglyNworCS8qIHVwZGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIEdUIHJlZ2lzdGVycyAqLworCWxpcwlyMTEsIENGR19HVF9SRUdTQGgKKwkvKiBpZiB3ZSdyZSB1c2luZyBFQ0MsIHdlIG11c3QgdXNlIHRoZSBETUEgZW5naW5lIHRvIGNvcHkgb3Vyc2VsdmVzICovCisJYmwJc3RhcnRfaWRtYV90cmFuc2Zlcl8wCisJYmwJd2FpdF9mb3JfaWRtYV8wCisJYmwJc3RvcF9pZG1hX2VuZ2luZV8wCisKKwltdGxyCXI3CisJYmxyCisKKwkuZ2xvYmwgYm9hcmRfaW5pdF9lY2MKK2JvYXJkX2luaXRfZWNjOgorCW1mbHIJcjcKKwkvKiBOT1RFOiByMTAgc3RpbGwgY29udGFpbnMgdGhlIGxvY2F0aW9uIHdlJ3ZlIGJlZW4gcmVsb2NhdGVkIHRvCisJICogd2hpY2ggaGFwcGVucyB0byBiZSBUT1BfT0ZfUkFNIC0gQ0ZHX01PTklUT1JfTEVOICovCisKKwkvKiBub3cgdGhhdCB3ZSdyZSBydW5uaW5nIGZyb20gcmFtLCBpbml0IHRoZSByZXN0IG9mIG1haW4gbWVtb3J5CisJICogZm9yIEVDQyB1c2UgKi8KKwlsaXMJcjgsIENGR19NT05JVE9SX0xFTkBoCisJb3JpCXI4LCByOCwgQ0ZHX01PTklUT1JfTEVOQGwKKworCWRpdncJcjMsIHIxMCwgcjgKKworCS8qIHNldCB1cCB0aGUgY291bnRlciwgYW5kIGluaXQgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgKi8KKwltdGN0cglyMworCWxpCXIxMiwgMAorCisJLyogYnl0ZXMgcGVyIHRyYW5zZmVyICovCisJbXIJcjUsIHI4CithYm91dF90b19pbml0X2VjYzoKKzE6CW1yCXIzLCByMTIKKwltcglyNCwgcjEyCisJYmwJc3RhcnRfaWRtYV90cmFuc2Zlcl8wCisJYmwJd2FpdF9mb3JfaWRtYV8wCisJYmwJc3RvcF9pZG1hX2VuZ2luZV8wCisJYWRkCXIxMiwgcjEyLCByOAorCWJkbnoJMWIKKworCW10bHIJcjcKKwlibHIKKworCS8qIHIzOglkZXN0IGFkZHIKKwkgKiByNDoJc291cmNlIGFkZHIKKwkgKiByNToJYnl0ZSBjb3VudAorCSAqIHIxMTogZ3QgcmVnYmFzZQorCSAqIHRyYXNoZXM6CSByNiwgcjUKKwkgKi8KK3N0YXJ0X2lkbWFfdHJhbnNmZXJfMDoKKwkvKiBzZXQgdGhlIGJ5dGUgY291bnQsIGluY2x1ZGluZyB0aGUgT1dOIGJpdCAqLworCW1yCXI2LCByMTEKKwlvcmkJcjYsIHI2LCBDSEFOTkVMMF9ETUFfQllURV9DT1VOVAorCXN0d2JyeAlyNSwgMCwgKHI2KQorCisJLyogc2V0IHRoZSBzb3VyY2UgYWRkcmVzcyAqLworCW1yCXI2LCByMTEKKwlvcmkJcjYsIHI2LCBDSEFOTkVMMF9ETUFfU09VUkNFX0FERFJFU1MKKwlzdHdicngJcjQsIDAsIChyNikKKworCS8qIHNldCB0aGUgZGVzdCBhZGRyZXNzICovCisJbXIJcjYsIHIxMQorCW9yaQlyNiwgcjYsIENIQU5ORUwwX0RNQV9ERVNUSU5BVElPTl9BRERSRVNTCisJc3R3YnJ4CXIzLCAwLCAocjYpCisKKwkvKiBzZXQgdGhlIG5leHQgcmVjb3JkIHBvaW50ZXIgKi8KKwlsaQlyNSwgMAorCW1yCXI2LCByMTEKKwlvcmkJcjYsIHI2LCBDSEFOTkVMME5FWFRfUkVDT1JEX1BPSU5URVIKKwlzdHdicngJcjUsIDAsIChyNikKKworCS8qIHNldCB0aGUgbG93IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBiaXQgOSBpcyBOT04gY2hhaW5lZCBtb2RlLCBiaXQgMzEgaXMgbmV3IHN0eWxlIGRlc2NyaXB0b3JzLgorCSAgIGJpdCAxMiBpcyBjaGFubmVsIGVuYWJsZSAqLworCW9yaQlyNSwgcjUsICgxIDw8IDEyKSB8ICgxIDw8IDEyKSB8ICgxIDw8IDExKQorCS8qIDE1IHNoaWZ0ZWQgYnkgMTYgKG9yaXMpID09IGJpdCAzMSAqLworCW9yaXMJcjUsIHI1LCAoMSA8PCAxNSkKKwltcglyNiwgcjExCisJb3JpCXI2LCByNiwgQ0hBTk5FTDBDT05UUk9MCisJc3R3YnJ4CXI1LCAwLCAocjYpCisKKwlibHIKKworCS8qIHRoaXMgd2FpdHMgZm9yIHRoZSBieXRlY291bnQgdG8gcmV0dXJuIHRvIHplcm8sIGluZGljYXRpbmcKKwkgKiB0aGF0IHRoZSB0cmFzZmVyIGlzIGNvbXBsZXRlICovCit3YWl0X2Zvcl9pZG1hXzA6CisJbXIJcjUsIHIxMQorCWxpcwlyNiwgMHhmZgorCW9yaQlyNiwgcjYsIDB4ZmZmZgorCW9yaQlyNSwgcjUsIENIQU5ORUwwX0RNQV9CWVRFX0NPVU5UCisxOglsd2JyeAlyNCwgMCwgKHI1KQorCWFuZC4JcjQsIHI0LCByNgorCWJuZQkxYgorCisJYmxyCisKKwkvKiB0aGlzIHR1cm5zIG9mZiBjaGFubmVsIDAgb2YgdGhlIGlkbWEgZW5naW5lICovCitzdG9wX2lkbWFfZW5naW5lXzA6CisJLyogc2h1dCBvZmYgdGhlIERNQSBlbmdpbmUgKi8KKwlsaQlyNSwgMAorCW1yCXI2LCByMTEKKwlvcmkJcjYsIHI2LCBDSEFOTkVMMENPTlRST0wKKwlzdHdicngJcjUsIDAsIChyNikKKworCWJscgorI2VuZGlmCisKKyNpZmRlZiBDRkdfQk9BUkRfQVNNX0lOSVQKKwkvKiBOT1RFOiB0cmFzaGVzIHIzLXI3ICovCisJLmdsb2JsIGJvYXJkX2FzbV9pbml0Citib2FyZF9hc21faW5pdDoKKwkvKiBqdXN0IG1vdmUgdGhlIEdUIHJlZ2lzdGVycyB0byB3aGVyZSB0aGV5IGJlbG9uZyAqLworCWxpcwlyMywgQ0ZHX0RGTF9HVF9SRUdTQGgKKwlvcmkJcjMsIHIzLCBDRkdfREZMX0dUX1JFR1NAbAorCWxpcwlyNCwgQ0ZHX0dUX1JFR1NAaAorCW9yaQlyNCwgcjQsIENGR19HVF9SRUdTQGwKKwlsaQlyNSwgSU5URVJOQUxfU1BBQ0VfREVDT0RFCisKKwkvKiB0ZXN0IHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5IG1vdmVkICovCisJbHdicngJcjYsIHI1LCByNAorCWFuZGkuCXI2LCByNiwgMHhmZmZmCisJLyogY2hlY2sgbG9hZGluZyBvZiBSNyBpczogMHgwRjgwIHNob3VsZDogMHhmODAwOiBET05FICovCisvKglybHdpbm0JcjcsIHI0LCA4LCAxNiwgMzEKKwlybHdpbm0JcjcsIHI0LCAxMiwgMTYsIDMxCSovIC8qIG9yaWdpbmFsICovCisJcmx3aW5tCXI3LCByNCwgMTYsIDE2LCAzMQorCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwljbXAJY3IwLCByNywgcjYKKwliZXFscgorCisJLyogbm9wZSwgaGF2ZSB0byBtb3ZlIHRoZSByZWdpc3RlcnMgKi8KKwlsd2JyeAlyNiwgcjUsIHIzCisJYW5kaXMuCXI2LCByNiwgMHhmZmZmCisJb3IJcjYsIHI2LCByNworCXN0d2JyeAlyNiwgcjUsIHIzCisKKwkvKiBub3csIHBvbGwgZm9yIHRoZSBjaGFuZ2UgKi8KKzE6CWx3YnJ4CXI3LCByNSwgcjQKKwljbXAJY3IwLCByNywgcjYKKwlibmUJMWIKKworCS8qIGRvbmUhICovCisJYmxyCisjZW5kaWYKKworLyogRm9yIHVzZSBvZiB0aGUgZGVidWcgTEVEcyAqLworCS5nbG9iYWwgbGVkX29uMF9yZWxvY2F0ZWQKK2xlZF9vbjBfcmVsb2NhdGVkOgorCXhvcglyMjEsIHIyMSwgcjIxCisJeG9yCXIxOCwgcjE4LCByMTgKKwlsaXMJcjE4LCAweEZDODAKKwlvcmkJcjE4LCByMTgsIDB4ODAwMAorCXN0dwlyMjEsIDB4MChyMTgpCisvKgkgIHN0dwkgIHIxOCwgMHgwKHIxOCkgKi8KKwlzeW5jCisJYmxyCisKKwkuZ2xvYmFsIGxlZF9vZmYwX3JlbG9jYXRlZAorbGVkX29mZjBfcmVsb2NhdGVkOgorCXhvcglyMjEsIHIyMSwgcjIxCisJeG9yCXIxOCwgcjE4LCByMTgKKwlsaXMJcjE4LCAweEZDODEKKwlvcmkJcjE4LCByMTgsIDB4NDAwMAorCXN0dwlyMjEsIDB4MChyMTgpCisvKgkgIHN0dwkgIHIxOCwgMHgwKHIxOCkgKi8KKwlzeW5jCisJYmxyCisKKwkuZ2xvYmFsIGxlZF9vbjAKK2xlZF9vbjA6CisJeG9yCXIxOCwgcjE4LCByMTgKKwlsaXMJcjE4LCAweDFjODAKKwlvcmkJcjE4LCByMTgsIDB4ODAwMAorCXN0dwlyMTgsIDB4MChyMTgpCisJc3luYworCWJscgorCisJLmdsb2JhbCBsZWRfb2ZmMAorbGVkX29mZjA6CisJeG9yCXIxOCwgcjE4LCByMTgKKwlsaXMJcjE4LCAweDFjODEKKwlvcmkJcjE4LCByMTgsIDB4NDAwMAorCXN0dwlyMTgsIDB4MChyMTgpCisJc3luYworCWJscgorCisJLmdsb2JhbCBsZWRfb24xCitsZWRfb24xOgorCXhvcglyMTgsIHIxOCwgcjE4CisJbGlzCXIxOCwgMHgxYzgwCisJb3JpCXIxOCwgcjE4LCAweGMwMDAKKwlzdHcJcjE4LCAweDAocjE4KQorCXN5bmMKKwlibHIKKworCS5nbG9iYWwgbGVkX29mZjEKK2xlZF9vZmYxOgorCXhvcglyMTgsIHIxOCwgcjE4CisJbGlzCXIxOCwgMHgxYzgxCisJb3JpCXIxOCwgcjE4LCAweDgwMDAKKwlzdHcJcjE4LCAweDAocjE4KQorCXN5bmMKKwlibHIKKworCS5nbG9iYWwgbGVkX29uMgorbGVkX29uMjoKKwl4b3IJcjE4LCByMTgsIHIxOAorCWxpcwlyMTgsIDB4MWM4MQorCW9yaQlyMTgsIHIxOCwgMHgwMDAwCisJc3R3CXIxOCwgMHgwKHIxOCkKKwlzeW5jCisJYmxyCisKKwkuZ2xvYmFsIGxlZF9vZmYyCitsZWRfb2ZmMjoKKwl4b3IJcjE4LCByMTgsIHIxOAorCWxpcwlyMTgsIDB4MWM4MQorCW9yaQlyMTgsIHIxOCwgMHhjMDAwCisJc3R3CXIxOCwgMHgwKHIxOCkKKwlzeW5jCisJYmxyCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9uczE2NTUwLmMgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9uczE2NTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NDQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL25zMTY1NTAuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ09NMSBOUzE2NTUwIHN1cHBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5jKQorICogbW9kaWZpZWQgdG8gdXNlIENGR19JU0FfTUVNIGFuZCBuZXcgZGVmaW5lcworICoKKyAqIGZ1cnRoZXIgbW9kaWZpZWQgYnkgSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+IHRvIHN1cHBvcnQKKyAqIHRoZSBEVUFSVCBvbiB0aGUgR2FsaWxlbyBFdmFsIGJvYXJkLiAoZGI2NDM2MCkKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAibnMxNjU1MC5oIgorCisjaWZkZWYgWlVNQV9OVEwKKy8qIG5vIDE2NTUwIGRldmljZSAqLworI2Vsc2UKK2NvbnN0IE5TMTY1NTBfdCBDT01fUE9SVFNbXSA9IHsgKE5TMTY1NTBfdCkgKENGR19EVUFSVF9JTyArIDApLAorCShOUzE2NTUwX3QpIChDRkdfRFVBUlRfSU8gKyAweDIwKQorfTsKKwordm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKk5TMTY1NTBfaW5pdCAoaW50IGNoYW4sIGludCBiYXVkX2Rpdmlzb3IpCit7CisJdm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0OworCisJY29tX3BvcnQgPSAoc3RydWN0IE5TMTY1NTAgKikgQ09NX1BPUlRTW2NoYW5dOworCWNvbV9wb3J0LT5pZXIgPSAweDAwOworCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRTsJLyogQWNjZXNzIGJhdWQgcmF0ZSAqLworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOwkvKiA5NjAwIGJhdWQgKi8KKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUl84TjE7CS8qIDggZGF0YSwgMSBzdG9wLCBubyBwYXJpdHkgKi8KKwljb21fcG9ydC0+bWNyID0gTUNSX0RUUiB8IE1DUl9SVFM7CS8qIFJUUy9EVFIgKi8KKworCS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisJY29tX3BvcnQtPmZjciA9IEZDUl9GSUZPX0VOIHwgRkNSX1JYU1IgfCBGQ1JfVFhTUjsKKwlyZXR1cm4gKGNvbV9wb3J0KTsKK30KKwordm9pZCBOUzE2NTUwX3JlaW5pdCAodm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKQoreworCWNvbV9wb3J0LT5pZXIgPSAweDAwOworCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRTsJLyogQWNjZXNzIGJhdWQgcmF0ZSAqLworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOwkvKiA5NjAwIGJhdWQgKi8KKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUl84TjE7CS8qIDggZGF0YSwgMSBzdG9wLCBubyBwYXJpdHkgKi8KKwljb21fcG9ydC0+bWNyID0gTUNSX0RUUiB8IE1DUl9SVFM7CS8qIFJUUy9EVFIgKi8KKworCS8qIENsZWFyICYgZW5hYmxlIEZJRk9zICovCisJY29tX3BvcnQtPmZjciA9IEZDUl9GSUZPX0VOIHwgRkNSX1JYU1IgfCBGQ1JfVFhTUjsKK30KKwordm9pZCBOUzE2NTUwX3B1dGMgKHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwICpjb21fcG9ydCwgdW5zaWduZWQgY2hhciBjKQoreworCXdoaWxlICgoY29tX3BvcnQtPmxzciAmIExTUl9USFJFKSA9PSAwKTsKKwljb21fcG9ydC0+dGhyID0gYzsKK30KKwordW5zaWduZWQgY2hhciBOUzE2NTUwX2dldGMgKHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwICpjb21fcG9ydCkKK3sKKwl3aGlsZSAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfRFIpID09IDApOworCXJldHVybiAoY29tX3BvcnQtPnJicik7Cit9CisKK2ludCBOUzE2NTUwX3RzdGMgKHZvbGF0aWxlIHN0cnVjdCBOUzE2NTUwICpjb21fcG9ydCkKK3sKKwlyZXR1cm4gKChjb21fcG9ydC0+bHNyICYgTFNSX0RSKSAhPSAwKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9jb21tb24vbnMxNjU1MC5oIGIvYm9hcmQvTWFydmVsbC9jb21tb24vbnMxNjU1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWQyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9uczE2NTUwLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBOUzE2NTUwIFNlcmlhbCBQb3J0CisgKiBvcmlnaW5hbGx5IGZyb20gbGludXggc291cmNlIChhcmNoL3BwYy9ib290L25zMTY1NTAuaCkKKyAqIG1vZGlmaWVkIHNsaWdodGx5IHRvCisgKiBoYXZlIGFkZHJlc3NlcyBhcyBvZmZzZXRzIGZyb20gQ0ZHX0lTQV9CQVNFCisgKiBhZGRlZCBhIGZldyBtb3JlIGRlZmluaXRpb25zCisgKiBhZGRlZCBwcm90b3R5cGVzIGZvciBuczE2NTUwLmMKKyAqIHJlZHVjZWQgbm8gb2YgY29tIHBvcnRzIHRvIDIKKyAqIG1vZGlmaWNhdGlvbnMgKGMpIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gMjAwMC4KKyAqCisgKiBmdXJ0aGVyIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIERVQVJUIGluIHRoZSBHYWxpbGVvIGV2YWwgYm9hcmQKKyAqIG1vZGlmaWNhdGlvbnMgKGMpIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICovCisKKyNpZm5kZWYgX19OUzE2NTUwX0hfXworI2RlZmluZSBfX05TMTY1NTBfSF9fCisKKy8qIHRoZSBwYWRkaW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9uIHRoZSBnYWxpbGVvIGJvYXJkIHRoZSBVQVJUIGlzCisgICB3aXJlZCBpbiB3aXRoIHRoZSAzIGFkZHJlc3MgbGluZXMgc2hpZnRlZCBvdmVyIGJ5IDIgYml0cyAqLworc3RydWN0IE5TMTY1NTAKK3sKKwl1bnNpZ25lZCBjaGFyIHJicjsgIC8qIDAgPSAwLTMqLworCWludCBwYWQxOjI0OworCisJdW5zaWduZWQgY2hhciBpZXI7ICAvKiAxID0gNC03Ki8KKwlpbnQgcGFkMjoyNDsKKworCXVuc2lnbmVkIGNoYXIgZmNyOyAgLyogMiA9IDgtYiovCisJaW50IHBhZDM6MjQ7CisKKwl1bnNpZ25lZCBjaGFyIGxjcjsgIC8qIDMgPSBjLWYqLworCWludCBwYWQ0OjI0OworCisJdW5zaWduZWQgY2hhciBtY3I7ICAvKiA0ID0gMTAtMTMqLworCWludCBwYWQ1OjI0OworCisJdW5zaWduZWQgY2hhciBsc3I7ICAvKiA1ID0gMTQtMTcqLworCWludCBwYWQ2OjI0OworCisJdW5zaWduZWQgY2hhciBtc3I7ICAvKiA2ID0xOC0xYiovCisJaW50IHBhZDc6MjQ7CisKKwl1bnNpZ25lZCBjaGFyIHNjcjsgIC8qIDcgPTFjLTFmKi8KKwlpbnQgcGFkODoyNDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBhbGlhc2VzICovCisjZGVmaW5lIHRociByYnIKKyNkZWZpbmUgaWlyIGZjcgorI2RlZmluZSBkbGwgcmJyCisjZGVmaW5lIGRsbSBpZXIKKworI2RlZmluZSBGQ1JfRklGT19FTiAgICAgMHgwMSAgICAvKmZpZm8gZW5hYmxlKi8KKyNkZWZpbmUgRkNSX1JYU1IgICAgICAgIDB4MDIgICAgLypyZWNpZXZlciBzb2Z0IHJlc2V0Ki8KKyNkZWZpbmUgRkNSX1RYU1IgICAgICAgIDB4MDQgICAgLyp0cmFuc21pdHRlciBzb2Z0IHJlc2V0Ki8KKworCisjZGVmaW5lIE1DUl9EVFIgICAgICAgICAweDAxCisjZGVmaW5lIE1DUl9SVFMgICAgICAgICAweDAyCisjZGVmaW5lIE1DUl9ETUFfRU4gICAgICAweDA0CisjZGVmaW5lIE1DUl9UWF9ERlIgICAgICAweDA4CisKKworI2RlZmluZSBMQ1JfV0xTX01TSyAweDAzICAgIC8qIGNoYXJhY3RlciBsZW5ndGggc2xlY3QgbWFzayovCisjZGVmaW5lIExDUl9XTFNfNSAgIDB4MDAgICAgLyogNSBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfV0xTXzYgICAweDAxICAgIC8qIDYgYml0IGNoYXJhY3RlciBsZW5ndGggKi8KKyNkZWZpbmUgTENSX1dMU183ICAgMHgwMiAgICAvKiA3IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfOCAgIDB4MDMgICAgLyogOCBiaXQgY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZSBMQ1JfU1RCICAgICAweDA0ICAgIC8qIE51bWJlciBvZiBzdG9wIEJpdHMsIG9mZiA9IDEsIG9uID0gMS41IG9yIDIpICovCisjZGVmaW5lIExDUl9QRU4gICAgIDB4MDggICAgLyogUGFyaXR5IGVuZWJsZSovCisjZGVmaW5lIExDUl9FUFMgICAgIDB4MTAgICAgLyogRXZlbiBQYXJpdHkgU2VsZWN0Ki8KKyNkZWZpbmUgTENSX1NUS1AgICAgMHgyMCAgICAvKiBTdGljayBQYXJpdHkqLworI2RlZmluZSBMQ1JfU0JSSyAgICAweDQwICAgIC8qIFNldCBCcmVhayovCisjZGVmaW5lIExDUl9CS1NFICAgIDB4ODAgICAgLyogQmFuayBzZWxlY3QgZW5hYmxlKi8KKworI2RlZmluZSBMU1JfRFIgICAgICAweDAxICAgIC8qIERhdGEgcmVhZHkgKi8KKyNkZWZpbmUgTFNSX09FICAgICAgMHgwMiAgICAvKiBPdmVycnVuICovCisjZGVmaW5lIExTUl9QRSAgICAgIDB4MDQgICAgLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIExTUl9GRSAgICAgIDB4MDggICAgLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBMU1JfQkkgICAgICAweDEwICAgIC8qIEJyZWFrICovCisjZGVmaW5lIExTUl9USFJFICAgIDB4MjAgICAgLyogWG1pdCBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIExTUl9URU1UICAgIDB4NDAgICAgLyogWG1pdHRlciBlbXB0eSAqLworI2RlZmluZSBMU1JfRVJSICAgICAweDgwICAgIC8qIEVycm9yICovCisKKy8qIHVzZWZ1bCBkZWZhdWx0cyBmb3IgTENSKi8KKyNkZWZpbmUgTENSXzhOMSAgICAgMHgwMworCisKKyNkZWZpbmUgQ09NMSAweDAzRjgKKyNkZWZpbmUgQ09NMiAweDAyRjgKKwordm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKiBOUzE2NTUwX2luaXQoaW50IGNoYW4sIGludCBiYXVkX2Rpdmlzb3IpOwordm9pZCBOUzE2NTUwX3B1dGModm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0LCB1bnNpZ25lZCBjaGFyIGMpOwordW5zaWduZWQgY2hhciBOUzE2NTUwX2dldGModm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0KTsKK2ludCBOUzE2NTUwX3RzdGModm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0KTsKK3ZvaWQgTlMxNjU1MF9yZWluaXQodm9sYXRpbGUgc3RydWN0IE5TMTY1NTAgKmNvbV9wb3J0LCBpbnQgYmF1ZF9kaXZpc29yKTsKKwordHlwZWRlZiBzdHJ1Y3QgTlMxNjU1MCAqTlMxNjU1MF90OworCitleHRlcm4gY29uc3QgTlMxNjU1MF90IENPTV9QT1JUU1tdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvY29tbW9uL3BwY19lcnJvcl9uby5oIGIvYm9hcmQvTWFydmVsbC9jb21tb24vcHBjX2Vycm9yX25vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ODdjOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL3BwY19lcnJvcl9uby5oCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIEJLIElkOiBTQ0NTL3MuZXJybm8uaCAxLjkgMDYvMDUvMDEgMjE6NDU6MjEgcGF1bHVzCisgKi8KKyNpZm5kZWYgX01WX1BQQ19FUlJOT19ICisjZGVmaW5lIF9NVl9QUENfRVJSTk9fSAorCisjZGVmaW5lCUVQRVJNCQkgMQkvKiBPcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLworI2RlZmluZQlFTk9FTlQJCSAyCS8qIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRVNSQ0gJCSAzCS8qIE5vIHN1Y2ggcHJvY2VzcyAqLworI2RlZmluZQlFSU5UUgkJIDQJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgKi8KKyNkZWZpbmUJRUlPCQkgNQkvKiBJL08gZXJyb3IgKi8KKyNkZWZpbmUJRU5YSU8JCSA2CS8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MgKi8KKyNkZWZpbmUJRTJCSUcJCSA3CS8qIEFyZyBsaXN0IHRvbyBsb25nICovCisjZGVmaW5lCUVOT0VYRUMJCSA4CS8qIEV4ZWMgZm9ybWF0IGVycm9yICovCisjZGVmaW5lCUVCQURGCQkgOQkvKiBCYWQgZmlsZSBudW1iZXIgKi8KKyNkZWZpbmUJRUNISUxECQkxMAkvKiBObyBjaGlsZCBwcm9jZXNzZXMgKi8KKyNkZWZpbmUJRUFHQUlOCQkxMQkvKiBUcnkgYWdhaW4gKi8KKyNkZWZpbmUJRU5PTUVNCQkxMgkvKiBPdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lCUVBQ0NFUwkJMTMJLyogUGVybWlzc2lvbiBkZW5pZWQgKi8KKyNkZWZpbmUJRUZBVUxUCQkxNAkvKiBCYWQgYWRkcmVzcyAqLworI2RlZmluZQlFTk9UQkxLCQkxNQkvKiBCbG9jayBkZXZpY2UgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRUJVU1kJCTE2CS8qIERldmljZSBvciByZXNvdXJjZSBidXN5ICovCisjZGVmaW5lCUVFWElTVAkJMTcJLyogRmlsZSBleGlzdHMgKi8KKyNkZWZpbmUJRVhERVYJCTE4CS8qIENyb3NzLWRldmljZSBsaW5rICovCisjZGVmaW5lCUVOT0RFVgkJMTkJLyogTm8gc3VjaCBkZXZpY2UgKi8KKyNkZWZpbmUJRU5PVERJUgkJMjAJLyogTm90IGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCUVJU0RJUgkJMjEJLyogSXMgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJRUlOVkFMCQkyMgkvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisjZGVmaW5lCUVORklMRQkJMjMJLyogRmlsZSB0YWJsZSBvdmVyZmxvdyAqLworI2RlZmluZQlFTUZJTEUJCTI0CS8qIFRvbyBtYW55IG9wZW4gZmlsZXMgKi8KKyNkZWZpbmUJRU5PVFRZCQkyNQkvKiBOb3QgYSB0eXBld3JpdGVyICovCisjZGVmaW5lCUVUWFRCU1kJCTI2CS8qIFRleHQgZmlsZSBidXN5ICovCisjZGVmaW5lCUVGQklHCQkyNwkvKiBGaWxlIHRvbyBsYXJnZSAqLworI2RlZmluZQlFTk9TUEMJCTI4CS8qIE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlICovCisjZGVmaW5lCUVTUElQRQkJMjkJLyogSWxsZWdhbCBzZWVrICovCisjZGVmaW5lCUVST0ZTCQkzMAkvKiBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUJRU1MSU5LCQkzMQkvKiBUb28gbWFueSBsaW5rcyAqLworI2RlZmluZQlFUElQRQkJMzIJLyogQnJva2VuIHBpcGUgKi8KKyNkZWZpbmUJRURPTQkJMzMJLyogTWF0aCBhcmd1bWVudCBvdXQgb2YgZG9tYWluIG9mIGZ1bmMgKi8KKyNkZWZpbmUJRVJBTkdFCQkzNAkvKiBNYXRoIHJlc3VsdCBub3QgcmVwcmVzZW50YWJsZSAqLworI2RlZmluZQlFREVBRExLCQkzNQkvKiBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1ciAqLworI2RlZmluZQlFTkFNRVRPT0xPTkcJMzYJLyogRmlsZSBuYW1lIHRvbyBsb25nICovCisjZGVmaW5lCUVOT0xDSwkJMzcJLyogTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTk9TWVMJCTM4CS8qIEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZQlFTk9URU1QVFkJMzkJLyogRGlyZWN0b3J5IG5vdCBlbXB0eSAqLworI2RlZmluZQlFTE9PUAkJNDAJLyogVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgKi8KKyNkZWZpbmUJRVdPVUxEQkxPQ0sJRUFHQUlOCS8qIE9wZXJhdGlvbiB3b3VsZCBibG9jayAqLworI2RlZmluZQlFTk9NU0cJCTQyCS8qIE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlICovCisjZGVmaW5lCUVJRFJNCQk0MwkvKiBJZGVudGlmaWVyIHJlbW92ZWQgKi8KKyNkZWZpbmUJRUNIUk5HCQk0NAkvKiBDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UgKi8KKyNkZWZpbmUJRUwyTlNZTkMJNDUJLyogTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkICovCisjZGVmaW5lCUVMM0hMVAkJNDYJLyogTGV2ZWwgMyBoYWx0ZWQgKi8KKyNkZWZpbmUJRUwzUlNUCQk0NwkvKiBMZXZlbCAzIHJlc2V0ICovCisjZGVmaW5lCUVMTlJORwkJNDgJLyogTGluayBudW1iZXIgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lCUVVTkFUQ0gJCTQ5CS8qIFByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQgKi8KKyNkZWZpbmUJRU5PQ1NJCQk1MAkvKiBObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSAqLworI2RlZmluZQlFTDJITFQJCTUxCS8qIExldmVsIDIgaGFsdGVkICovCisjZGVmaW5lCUVCQURFCQk1MgkvKiBJbnZhbGlkIGV4Y2hhbmdlICovCisjZGVmaW5lCUVCQURSCQk1MwkvKiBJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciAqLworI2RlZmluZQlFWEZVTEwJCTU0CS8qIEV4Y2hhbmdlIGZ1bGwgKi8KKyNkZWZpbmUJRU5PQU5PCQk1NQkvKiBObyBhbm9kZSAqLworI2RlZmluZQlFQkFEUlFDCQk1NgkvKiBJbnZhbGlkIHJlcXVlc3QgY29kZSAqLworI2RlZmluZQlFQkFEU0xUCQk1NwkvKiBJbnZhbGlkIHNsb3QgKi8KKyNkZWZpbmUJRURFQURMT0NLCTU4CS8qIEZpbGUgbG9ja2luZyBkZWFkbG9jayBlcnJvciAqLworI2RlZmluZQlFQkZPTlQJCTU5CS8qIEJhZCBmb250IGZpbGUgZm9ybWF0ICovCisjZGVmaW5lCUVOT1NUUgkJNjAJLyogRGV2aWNlIG5vdCBhIHN0cmVhbSAqLworI2RlZmluZQlFTk9EQVRBCQk2MQkvKiBObyBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZQlFVElNRQkJNjIJLyogVGltZXIgZXhwaXJlZCAqLworI2RlZmluZQlFTk9TUgkJNjMJLyogT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzICovCisjZGVmaW5lCUVOT05FVAkJNjQJLyogTWFjaGluZSBpcyBub3Qgb24gdGhlIG5ldHdvcmsgKi8KKyNkZWZpbmUJRU5PUEtHCQk2NQkvKiBQYWNrYWdlIG5vdCBpbnN0YWxsZWQgKi8KKyNkZWZpbmUJRVJFTU9URQkJNjYJLyogT2JqZWN0IGlzIHJlbW90ZSAqLworI2RlZmluZQlFTk9MSU5LCQk2NwkvKiBMaW5rIGhhcyBiZWVuIHNldmVyZWQgKi8KKyNkZWZpbmUJRUFEVgkJNjgJLyogQWR2ZXJ0aXNlIGVycm9yICovCisjZGVmaW5lCUVTUk1OVAkJNjkJLyogU3Jtb3VudCBlcnJvciAqLworI2RlZmluZQlFQ09NTQkJNzAJLyogQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kICovCisjZGVmaW5lCUVQUk9UTwkJNzEJLyogUHJvdG9jb2wgZXJyb3IgKi8KKyNkZWZpbmUJRU1VTFRJSE9QCTcyCS8qIE11bHRpaG9wIGF0dGVtcHRlZCAqLworI2RlZmluZQlFRE9URE9UCQk3MwkvKiBSRlMgc3BlY2lmaWMgZXJyb3IgKi8KKyNkZWZpbmUJRUJBRE1TRwkJNzQJLyogTm90IGEgZGF0YSBtZXNzYWdlICovCisjZGVmaW5lCUVPVkVSRkxPVwk3NQkvKiBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlICovCisjZGVmaW5lCUVOT1RVTklRCTc2CS8qIE5hbWUgbm90IHVuaXF1ZSBvbiBuZXR3b3JrICovCisjZGVmaW5lCUVCQURGRAkJNzcJLyogRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSAqLworI2RlZmluZQlFUkVNQ0hHCQk3OAkvKiBSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkICovCisjZGVmaW5lCUVMSUJBQ0MJCTc5CS8qIENhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5ICovCisjZGVmaW5lCUVMSUJCQUQJCTgwCS8qIEFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSAqLworI2RlZmluZQlFTElCU0NOCQk4MQkvKiAubGliIHNlY3Rpb24gaW4gYS5vdXQgY29ycnVwdGVkICovCisjZGVmaW5lCUVMSUJNQVgJCTgyCS8qIEF0dGVtcHRpbmcgdG8gbGluayBpbiB0b28gbWFueSBzaGFyZWQgbGlicmFyaWVzICovCisjZGVmaW5lCUVMSUJFWEVDCTgzCS8qIENhbm5vdCBleGVjIGEgc2hhcmVkIGxpYnJhcnkgZGlyZWN0bHkgKi8KKyNkZWZpbmUJRUlMU0VRCQk4NAkvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KKyNkZWZpbmUJRVJFU1RBUlQJODUJLyogSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCAqLworI2RlZmluZQlFU1RSUElQRQk4NgkvKiBTdHJlYW1zIHBpcGUgZXJyb3IgKi8KKyNkZWZpbmUJRVVTRVJTCQk4NwkvKiBUb28gbWFueSB1c2VycyAqLworI2RlZmluZQlFTk9UU09DSwk4OAkvKiBTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQgKi8KKyNkZWZpbmUJRURFU1RBRERSUkVRCTg5CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQgKi8KKyNkZWZpbmUJRU1TR1NJWkUJOTAJLyogTWVzc2FnZSB0b28gbG9uZyAqLworI2RlZmluZQlFUFJPVE9UWVBFCTkxCS8qIFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCAqLworI2RlZmluZQlFTk9QUk9UT09QVAk5MgkvKiBQcm90b2NvbCBub3QgYXZhaWxhYmxlICovCisjZGVmaW5lCUVQUk9UT05PU1VQUE9SVAk5MwkvKiBQcm90b2NvbCBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVTT0NLVE5PU1VQUE9SVAk5NAkvKiBTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVPUE5PVFNVUFAJOTUJLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50ICovCisjZGVmaW5lCUVQRk5PU1VQUE9SVAk5NgkvKiBQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUZOT1NVUFBPUlQJOTcJLyogQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbCAqLworI2RlZmluZQlFQUREUklOVVNFCTk4CS8qIEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UgKi8KKyNkZWZpbmUJRUFERFJOT1RBVkFJTAk5OQkvKiBDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzICovCisjZGVmaW5lCUVORVRET1dOCTEwMAkvKiBOZXR3b3JrIGlzIGRvd24gKi8KKyNkZWZpbmUJRU5FVFVOUkVBQ0gJMTAxCS8qIE5ldHdvcmsgaXMgdW5yZWFjaGFibGUgKi8KKyNkZWZpbmUJRU5FVFJFU0VUCTEwMgkvKiBOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0ICovCisjZGVmaW5lCUVDT05OQUJPUlRFRAkxMDMJLyogU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQgKi8KKyNkZWZpbmUJRUNPTk5SRVNFVAkxMDQJLyogQ29ubmVjdGlvbiByZXNldCBieSBwZWVyICovCisjZGVmaW5lCUVOT0JVRlMJCTEwNQkvKiBObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlICovCisjZGVmaW5lCUVJU0NPTk4JCTEwNgkvKiBUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQgKi8KKyNkZWZpbmUJRU5PVENPTk4JMTA3CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkICovCisjZGVmaW5lCUVTSFVURE9XTgkxMDgJLyogQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duICovCisjZGVmaW5lCUVUT09NQU5ZUkVGUwkxMDkJLyogVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSAqLworI2RlZmluZQlFVElNRURPVVQJMTEwCS8qIENvbm5lY3Rpb24gdGltZWQgb3V0ICovCisjZGVmaW5lCUVDT05OUkVGVVNFRAkxMTEJLyogQ29ubmVjdGlvbiByZWZ1c2VkICovCisjZGVmaW5lCUVIT1NURE9XTgkxMTIJLyogSG9zdCBpcyBkb3duICovCisjZGVmaW5lCUVIT1NUVU5SRUFDSAkxMTMJLyogTm8gcm91dGUgdG8gaG9zdCAqLworI2RlZmluZQlFQUxSRUFEWQkxMTQJLyogT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJRUlOUFJPR1JFU1MJMTE1CS8qIE9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJRVNUQUxFCQkxMTYJLyogU3RhbGUgTkZTIGZpbGUgaGFuZGxlICovCisjZGVmaW5lCUVVQ0xFQU4JCTExNwkvKiBTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmcgKi8KKyNkZWZpbmUJRU5PVE5BTQkJMTE4CS8qIE5vdCBhIFhFTklYIG5hbWVkIHR5cGUgZmlsZSAqLworI2RlZmluZQlFTkFWQUlMCQkxMTkJLyogTm8gWEVOSVggc2VtYXBob3JlcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUJRUlTTkFNCQkxMjAJLyogSXMgYSBuYW1lZCB0eXBlIGZpbGUgKi8KKyNkZWZpbmUJRVJFTU9URUlPCTEyMQkvKiBSZW1vdGUgSS9PIGVycm9yICovCisjZGVmaW5lCUVEUVVPVAkJMTIyCS8qIFF1b3RhIGV4Y2VlZGVkICovCisKKyNkZWZpbmUJRU5PTUVESVVNCTEyMwkvKiBObyBtZWRpdW0gZm91bmQgKi8KKyNkZWZpbmUJRU1FRElVTVRZUEUJMTI0CS8qIFdyb25nIG1lZGl1bSB0eXBlICovCisKKy8qIFNob3VsZCBuZXZlciBiZSBzZWVuIGJ5IHVzZXIgcHJvZ3JhbXMgKi8KKyNkZWZpbmUgRVJFU1RBUlRTWVMJNTEyCisjZGVmaW5lIEVSRVNUQVJUTk9JTlRSCTUxMworI2RlZmluZSBFUkVTVEFSVE5PSEFORAk1MTQJLyogcmVzdGFydCBpZiBubyBoYW5kbGVyLi4gKi8KKyNkZWZpbmUgRU5PSU9DVExDTUQJNTE1CS8qIE5vIGlvY3RsIGNvbW1hbmQgKi8KKworI2RlZmluZSBfTEFTVF9FUlJOTwk1MTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYyBiL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGQyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuYwpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogbW9kaWZpZWQgZm9yIG1hcnZlbGwgZGI2NDM2MCBldmFsIGJvYXJkIGJ5CisgKiBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIHNlcmlhbC5jIC0gc2VyaWFsIHN1cHBvcnQgZm9yIHRoZSBnYWwgZXYgYm9hcmQKKyAqLworCisvKiBzdXBwb3J0cyBib3RoIHRoZSAxNjY1MCBkdWFydCBhbmQgdGhlIE1QU0MgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21lbW9yeS5oIgorI2luY2x1ZGUgInNlcmlhbC5oIgorCisjaWZkZWYgQ09ORklHX0RCNjQzNjAKKyNpbmNsdWRlICIuLi9kYjY0MzYwL21wc2MuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RCNjQ0NjAKKyNpbmNsdWRlICIuLi9kYjY0NDYwL21wc2MuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibnMxNjU1MC5oIgorCisjaWZkZWYgQ09ORklHX01QU0MKKworCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiAoZGVmaW5lZCBDRkdfSU5JVF9DSEFOMSkgfHwgKGRlZmluZWQgQ0ZHX0lOSVRfQ0hBTjIpCisJaW50IGNsb2NrX2Rpdmlzb3IgPSAyMzA0MDAgLyBnZC0+YmF1ZHJhdGU7CisjZW5kaWYKKworCW1wc2NfaW5pdCAoZ2QtPmJhdWRyYXRlKTsKKworCS8qIGluaXQgdGhlIERVQVJUIGNoYW5zIHNvIHRoYXQgS0dEQiBpbiB0aGUga2VybmVsIGNhbiB1c2UgdGhlbSAqLworI2lmZGVmIENGR19JTklUX0NIQU4xCisJTlMxNjU1MF9yZWluaXQgKENPTV9QT1JUU1swXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKKyNpZmRlZiBDRkdfSU5JVF9DSEFOMgorCU5TMTY1NTBfcmVpbml0IChDT01fUE9SVFNbMV0sIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCisJcmV0dXJuICgwKTsKK30KKwordm9pZCBzZXJpYWxfcHV0YyAoY29uc3QgY2hhciBjKQoreworCWlmIChjID09ICdcbicpCisJCW1wc2NfcHV0Y2hhciAoJ1xyJyk7CisKKwltcHNjX3B1dGNoYXIgKGMpOworfQorCitpbnQgc2VyaWFsX2dldGMgKHZvaWQpCit7CisJcmV0dXJuIG1wc2NfZ2V0Y2hhciAoKTsKK30KKworaW50IHNlcmlhbF90c3RjICh2b2lkKQoreworCXJldHVybiBtcHNjX3Rlc3RfY2hhciAoKTsKK30KKwordm9pZCBzZXJpYWxfc2V0YnJnICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJZ2FsYnJnX3NldF9iYXVkcmF0ZSAoQ09ORklHX01QU0NfUE9SVCwgZ2QtPmJhdWRyYXRlKTsKK30KKworI2Vsc2UgIC8qICEgQ09ORklHX01QU0MgKi8KKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJaW50IGNsb2NrX2Rpdmlzb3IgPSAyMzA0MDAgLyBnZC0+YmF1ZHJhdGU7CisKKyNpZmRlZiBDRkdfSU5JVF9DSEFOMQorCSh2b2lkKSBOUzE2NTUwX2luaXQgKDAsIGNsb2NrX2Rpdmlzb3IpOworI2VuZGlmCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjIKKwkodm9pZCkgTlMxNjU1MF9pbml0ICgxLCBjbG9ja19kaXZpc29yKTsKKyNlbmRpZgorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQgc2VyaWFsX3B1dGMgKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlOUzE2NTUwX3B1dGMgKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0sICdccicpOworCisJTlMxNjU1MF9wdXRjIChDT01fUE9SVFNbQ0ZHX0RVQVJUX0NIQU5dLCBjKTsKK30KKworaW50IHNlcmlhbF9nZXRjICh2b2lkKQoreworCXJldHVybiBOUzE2NTUwX2dldGMgKENPTV9QT1JUU1tDRkdfRFVBUlRfQ0hBTl0pOworfQorCitpbnQgc2VyaWFsX3RzdGMgKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfdHN0YyAoQ09NX1BPUlRTW0NGR19EVUFSVF9DSEFOXSk7Cit9CisKK3ZvaWQgc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCWludCBjbG9ja19kaXZpc29yID0gMjMwNDAwIC8gZ2QtPmJhdWRyYXRlOworCisjaWZkZWYgQ0ZHX0lOSVRfQ0hBTjEKKwlOUzE2NTUwX3JlaW5pdCAoQ09NX1BPUlRTWzBdLCBjbG9ja19kaXZpc29yKTsKKyNlbmRpZgorI2lmZGVmIENGR19JTklUX0NIQU4yCisJTlMxNjU1MF9yZWluaXQgKENPTV9QT1JUU1sxXSwgY2xvY2tfZGl2aXNvcik7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIENPTkZJR19NUFNDICovCisKK3ZvaWQgc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKKyNpZiAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9LR0RCKQordm9pZCBrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQoreworfQorCit2b2lkIHB1dERlYnVnQ2hhciAoaW50IGMpCit7CisJc2VyaWFsX3B1dGMgKGMpOworfQorCit2b2lkIHB1dERlYnVnU3RyIChjb25zdCBjaGFyICpzdHIpCit7CisJc2VyaWFsX3B1dHMgKHN0cik7Cit9CisKK2ludCBnZXREZWJ1Z0NoYXIgKHZvaWQpCit7CisJcmV0dXJuIHNlcmlhbF9nZXRjICgpOworfQorCit2b2lkIGtnZGJfaW50ZXJydXB0aWJsZSAoaW50IHllcykKK3sKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogQ0ZHX0NNRF9LR0RCICovCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuaCBiL2JvYXJkL01hcnZlbGwvY29tbW9uL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZmM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2NvbW1vbi9zZXJpYWwuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBtb2RpZmllZCBmb3IgbWFydmVsbCBkYjY0MzYwIGV2YWwgYm9hcmQgYnkKKyAqIEluZ28gQXNzbXVzIDxpbmdvLmFzc211c0BrZXltaWxlLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKiBzZXJpYWwuaCAtIG1vc3RseSB1c2VmdWwgZm9yIERVQVJUIHNlcmlhbF9pbml0IGluIHNlcmlhbC5jICovCisKKyNpZm5kZWYgX19TRVJJQUxfSF9fCisjZGVmaW5lIF9fU0VSSUFMX0hfXworCisjaWYgMAorCisjZGVmaW5lIEIyMzA0MDAgICAgICAgICAxCisjZGVmaW5lIEIxMTUyMDAgICAgICAgICAyCisjZGVmaW5lIEI1NzYwMCAgICAgICAgICA0CisjZGVmaW5lIEIzODQwMCAgICAgICAgICA4MgorI2RlZmluZSBCMTkyMDAgICAgICAgICAgMTYzCisjZGVmaW5lIEI5NjAwICAgICAgICAgICAyNAorI2RlZmluZSBCNDgwMCAgICAgICAgICAgNjUxCisjZGVmaW5lIEIyNDAwICAgICAgICAgICAxMzAyCisjZGVmaW5lIEIxMjAwICAgICAgICAgICAyNjA0CisjZGVmaW5lIEI2MDAgICAgICAgICAgICA1MjA4CisjZGVmaW5lIEIzMDAgICAgICAgICAgICAxMDQxNworI2RlZmluZSBCMTUwICAgICAgICAgICAgMjA4MzMKKyNkZWZpbmUgQjExMCAgICAgICAgICAgIDI4NDA5CisjZGVmaW5lIEJERUZBVUxUICAgICAgICBCMTE1MjAwCisKKwkJCQkvKiB0aGlzIHN0dWZmIGlzIGltcG9ydGFudCB0byBpbml0aWFsaXplCisJCQkJdGhlIERVQVJUIGNoYW5uZWxzICovCisKKyNkZWZpbmUJU2NhbGUJCTB4MDFMCQkvKiBkaXN0YW5jZSBiZXR3ZWVuIHBvcnQgYWRkcmVzc2VzICovCisjZGVmaW5lCUNPTTEJCTB4MDAwMDAzZjgJCS8qIEtleWJvYXJkICovCisjZGVmaW5lIENPTTIJCTB4MDAwMDAyZjgJCS8qIEhvc3QgKi8KKworCisvKiBQb3J0IERlZmluaXRpb25zIHJlbGF0aXZlIHRvIGJhc2UgQ09NIHBvcnQgYWRkcmVzc2VzICovCisjZGVmaW5lIERhdGFJbgkoMHgwMCpTY2FsZSkJLyogZGF0YSBpbnB1dCBwb3J0ICovCisjZGVmaW5lIERhdGFPdXQJKDB4MDAqU2NhbGUpCS8qIGRhdGEgb3V0cHV0IHBvcnQgKi8KKyNkZWZpbmUgQmF1ZExzYgkoMHgwMCpTY2FsZSkJLyogYmF1ZCByYXRlIGRpdmlzb3IgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAqLworI2RlZmluZSBCYXVkTXNiCSgweDAxKlNjYWxlKQkvKiBiYXVkIHJhdGUgZGl2aXNvciBtb3N0IHNpZ25pZmljYW50IGJ5dGUgKi8KKyNkZWZpbmUJSWVyCSgweDAxKlNjYWxlKQkvKiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisjZGVmaW5lCUlpcgkoMHgwMipTY2FsZSkJLyogaW50ZXJydXB0IGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lCUxjcgkoMHgwMypTY2FsZSkJLyogbGluZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCU1jcgkoMHgwNCpTY2FsZSkJLyogbW9kZW0gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQlMc3IJKDB4MDUqU2NhbGUpCS8qIGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCU1zcgkoMHgwNipTY2FsZSkJLyogbW9kZW0gc3RhdHVzIHJlZ2lzdGVyICovCisKKy8qIEJpdCBEZWZpbml0aW9ucyBmb3IgYWJvdmUgcG9ydHMgKi8KKyNkZWZpbmUgTGNyRGxhYgkweDgwCS8qIGI3OgkgZW5hYmxlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVycyAqLworI2RlZmluZQlMY3JEZmx0CTB4MDMJLyogYjYtMDogbm8gcGFyaXR5LCAxIHN0b3AsIDggZGF0YSAqLworCisjZGVmaW5lCU1jclJ0cwkweDAyCS8qIGIxOglyZXF1ZXN0IHRvIHNlbmQgKEkgYW0gcmVhZHkgdG8geG1pdCkgKi8KKyNkZWZpbmUJTWNyRHRyCTB4MDEJLyogYjA6CWRhdGEgdGVybWluYWwgcmVhZHkgKEkgYW0gYWxpdmUgcmVhZHkgdG8gcmN2KSAqLworI2RlZmluZQlNY3JEZmx0CShNY3JSdHN8TWNyRHRyKQorCisjZGVmaW5lIExzclR4RAkweDYwMDAJLyogYjU6IHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKGkuZS4geG1pdCBPSyEpKi8KKwkJCS8qIGI2OiB0cmFuc21pdHRlciBlbXB0eSAqLworI2RlZmluZSBMc3JSeEQJMHgwMTAwCS8qIGIwOiByZWNlaXZlZCBkYXRhIHJlYWR5IChpLmUuIGdvdCBhIGJ5dGUhKSAqLworCisjZGVmaW5lCU1zclJpCTB4MDA0MAkvKiBiNjogcmluZyBpbmRpY2F0b3IgKG90aGVyIGd1eSBpcyByZWFkeSB0byByY3YpICovCisjZGVmaW5lCU1zckRzcgkweDAwMjAJLyogYjU6IGRhdGEgc2V0IHJlYWR5IChvdGhlciBndXkgaXMgYWxpdmUgcmVhZHkgdG8gcmN2ICovCisjZGVmaW5lCU1zckN0cwkweDAwMTAJLyogYjQ6IGNsZWFyIHRvIHNlbmQgKG90aGVyIGd1eSBpcyByZWFkeSB0byByY3YpICovCisKKyNkZWZpbmUgSWVyUmRhCTB4ZgkvKiBiMDogRW5hYmxlIHJlY2VpdmVkIGRhdGEgYXZhaWxhYmxlIGludGVycnVwdCAqLworCisjZW5kaWYKKworI2VuZGlmIC8qIF9fU0VSSUFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwLzY0MzYwLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvNjQzNjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjVlMjNiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwLzY0MzYwLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBtYWluIGJvYXJkIHN1cHBvcnQvaW5pdCBmb3IgdGhlIEdhbGlsZW8gRXZhbCBib2FyZCBEQjY0MzYwLgorICovCisKKyNpZm5kZWYgX182NDM2MF9IX18KKyNkZWZpbmUgX182NDM2MF9IX18KKworLyogQ1BVIENvbmZpZ3VyYXRpb24gYml0cyAqLworI2RlZmluZSBDUFVfQ09ORl9BRERSX01JU1NfRU4JKDEgPDwgOCkKKyNkZWZpbmUJQ1BVX0NPTkZfU0lOR0xFX0NQVQkoMSA8PCAxMSkKKyNkZWZpbmUJQ1BVX0NPTkZfRU5ESUFORVNTCSgxIDw8IDEyKQorI2RlZmluZSBDUFVfQ09ORl9QSVBFTElORQkoMSA8PCAxMykKKyNkZWZpbmUgQ1BVX0NPTkZfU1RPUF9SRVRSWQkoMSA8PCAxNykKKyNkZWZpbmUgQ1BVX0NPTkZfTVVMVElfREVDT0RFCSgxIDw8IDE4KQorI2RlZmluZSBDUFVfQ09ORl9EUF9WQUxJRAkoMSA8PCAxOSkKKyNkZWZpbmUgQ1BVX0NPTkZfUEVSUl9QUk9QCSgxIDw8IDIyKQorI2RlZmluZSBDUFVfQ09ORl9BQUNLX0RFTEFZXzIJKDEgPDwgMjUpCisjZGVmaW5lIENQVV9DT05GX0FQX1ZBTElECSgxIDw8IDI2KQorI2RlZmluZSBDUFVfQ09ORl9SRU1BUF9XUl9ESVMJKDEgPDwgMjcpCisKKy8qIENQVSBNYXN0ZXIgQ29udHJvbCBiaXRzICovCisjZGVmaW5lIENQVV9NQVNUX0NUTF9BUkJfRU4JKDEgPDwgOCkKKyNkZWZpbmUgQ1BVX01BU1RfQ1RMX01BU0tfQlJfMQkoMSA8PCA5KQorI2RlZmluZSBDUFVfTUFTVF9DVExfTV9XUl9UUklHCSgxIDw8IDEwKQorI2RlZmluZSBDUFVfTUFTVF9DVExfTV9SRF9UUklHCSgxIDw8IDExKQorI2RlZmluZSBDUFVfTUFTVF9DVExfQ0xFQU5fQkxLCSgxIDw8IDEyKQorI2RlZmluZSBDUFVfTUFTVF9DVExfRkxVU0hfQkxLCSgxIDw8IDEzKQorCisjZW5kaWYgLyogX182NDM2MF9IX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9NYWtlZmlsZSBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjY2RkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxCisjIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChCT0FSRCkuYQorCitTT0JKUwk9IC4uL2NvbW1vbi9taXNjLm8KKworT0JKUwk9ICQoQk9BUkQpLm8gLi4vY29tbW9uL2ZsYXNoLm8gLi4vY29tbW9uL3NlcmlhbC5vIC4uL2NvbW1vbi9tZW1vcnkubyBwY2kubyBcCisJICBtdl9ldGgubyAuLi9jb21tb24vbnMxNjU1MC5vIG1wc2MubyAuLi9jb21tb24vaTJjLm8gXAorCSAgc2RyYW1faW5pdC5vIC4uL2NvbW1vbi9pbnRlbF9mbGFzaC5vCisKKyQoTElCKToJLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykgJChTT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvY29uZmlnLm1rIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQyYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI4IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMQorIyBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBFVkI2NDM2MCBib2FyZHMKKyMKKworVEVYVF9CQVNFID0gMHhmZmYwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL2RiNjQzNjAuYyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9kYjY0MzYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NzAwYQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9kYjY0MzYwLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIG1vZGlmaWNhdGlvbnMgZm9yIHRoZSBEQjY0MzYwIGV2YWwgYm9hcmQgYmFzZWQgYnkgSW5nby5Bc3NtdXNAa2V5bWlsZS5jb20KKyAqLworCisvKgorICogZGI2NDM2MC5jIC0gbWFpbiBib2FyZCBzdXBwb3J0L2luaXQgZm9yIHRoZSBHYWxpbGVvIEV2YWwgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPDc0eHhfN3h4Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tZW1vcnkuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL3BjaS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorI2luY2x1ZGUgPG5ldC5oPgorCisjaW5jbHVkZSAiZXRoLmgiCisjaW5jbHVkZSAibXBzYy5oIgorI2luY2x1ZGUgImkyYy5oIgorI2luY2x1ZGUgIjY0MzYwLmgiCisjaW5jbHVkZSAibXZfcmVncy5oIgorCisjdW5kZWYJREVCVUcKKy8qI2RlZmluZQlERUJVRyAqLworCisjZGVmaW5lCU1BUF9QQ0kKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQKHgpIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZmx1c2hfZGF0YV9jYWNoZSAodm9pZCk7CitleHRlcm4gdm9pZCBpbnZhbGlkYXRlX2wxX2luc3RydWN0aW9uX2NhY2hlICh2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0aGlzIGlzIHRoZSBjdXJyZW50IEdUIHJlZ2lzdGVyIHNwYWNlIGxvY2F0aW9uICovCisvKiBpdCBzdGFydHMgYXQgQ0ZHX0RGTF9HVF9SRUdTIGJ1dCBtb3ZlcyBsYXRlciB0byBDRkdfR1RfUkVHUyAqLworCisvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW50IGNoYW5nZSBpdCB3aGlsZSB3ZSBhcmUgaW4gZmxhc2gsIHNvIHdlIGluaXRpYWxpemUgaXQKKyAqIHRvIHRoZSAiZmluYWwiIHZhbHVlLiBUaGlzIG1lYW5zIHRoYXQgYW55IGRlYnVnX2xlZCBjYWxscyBiZWZvcmUKKyAqIGJvYXJkX3ByZV9pbml0IHdvbnQgd29yayByaWdodCAobGlrZSBpbiBjcHVfaW5pdF9mKS4KKyAqIFNlZSBhbHNvIG15X3JlbWFwX2d0X3JlZ3MgYmVsb3cuIChOVEwpCisgKi8KKwordm9pZCBib2FyZF9wcmVib290bV9pbml0ICh2b2lkKTsKK3Vuc2lnbmVkIGludCBJTlRFUk5BTF9SRUdfQkFTRV9BRERSID0gQ0ZHX0dUX1JFR1M7CitpbnQgZGlzcGxheV9tZW1fbWFwICh2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhpcyBpcyBhIHZlcnNpb24gb2YgdGhlIEdUIHJlZ2lzdGVyIHNwYWNlIHJlbWFwcGluZyBmdW5jdGlvbiB0aGF0CisgKiBkb2Vzbid0IHRvdWNoIGdsb2JhbHMgKG1lYW5pbmcsIGl0J3Mgb2sgdG8gcnVuIGZyb20gZmxhc2guKQorICoKKyAqIFVuZm9ydHVuYXRlbHksIHRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGEgd3JpdGFibGUKKyAqIElOVEVSTkFMX1JFR19CQVNFX0FERFIgaXMgaW1wb3NzaWJsZS4gT2ggd2VsbC4KKyAqLworCit2b2lkIG15X3JlbWFwX2d0X3JlZ3MgKHUzMiBjdXJfbG9jLCB1MzIgbmV3X2xvYykKK3sKKwl1MzIgdGVtcDsKKworCS8qIGNoZWNrIGFuZCBzZWUgaWYgaXQncyBhbHJlYWR5IG1vdmVkICovCisKKy8qIG9yaWdpbmFsIHBwY2Jvb3QgMS4xLjYgc291cmNlCisKKwl0ZW1wID0gaW5fbGUzMigodTMyICopKG5ld19sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKTsKKwlpZiAoKHRlbXAgJiAweGZmZmYpID09IG5ld19sb2MgPj4gMjApCisJCXJldHVybjsKKworCXRlbXAgPSAoaW5fbGUzMigodTMyICopKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMjApOworCisJb3V0X2xlMzIoKHUzMiAqKShjdXJfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSwgdGVtcCk7CisKKwl3aGlsZSAoR1RSRUdSRUFEKElOVEVSTkFMX1NQQUNFX0RFQ09ERSkgIT0gdGVtcCk7CitvcmlnaW5hbCBwcGNib290IDEuMS42IHNvdXJjZSBlbmQgKi8KKworCXRlbXAgPSBpbl9sZTMyICgodTMyICopIChuZXdfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSk7CisJaWYgKCh0ZW1wICYgMHhmZmZmKSA9PSBuZXdfbG9jID4+IDE2KQorCQlyZXR1cm47CisKKwl0ZW1wID0gKGluX2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMTYpOworCisJb3V0X2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpLCB0ZW1wKTsKKworCXdoaWxlIChHVFJFR1JFQUQgKElOVEVSTkFMX1NQQUNFX0RFQ09ERSkgIT0gdGVtcCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisKK3N0YXRpYyB2b2lkIGd0X3BjaV9jb25maWcgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXQ7CisJdW5zaWduZWQgaW50IHZhbCA9IDB4MDBmZmY4NjQ7CS8qIERJTkszMjogQnVzTnVtIDIzOjE2LCAgRGV2TnVtIDE1OjExLCBGdW5jTnVtIDEwOjgsIFJlZ051bSA3OjIgKi8KKworCS8qIEluIFBDSVggbW9kZSBkZXZpY2VzIHByb3ZpZGUgdGhlaXIgb3duIGJ1cyBhbmQgZGV2aWNlIG51bWJlcnMuIFdlIHF1ZXJ5IHRoZSBEaXNjb3ZlcnkgSUkncworCSAqIGNvbmZpZyByZWdpc3RlcnMgYnkgd3JpdGluZyBvbmVzIHRvIHRoZSBidXMgYW5kIGRldmljZS4KKwkgKiBXZSB0aGVuIHVwZGF0ZSB0aGUgVmlydHVhbCByZWdpc3RlciB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVzIGFuZCBkZXZpY2UuCisJICovCisJaWYgKChHVFJFR1JFQUQgKFBDSV8wX01PREUpICYgKEJJVDQgfCBCSVQ1KSkgIT0gMCkgewkvKmlmICBQQ0ktWCAqLworCQlHVF9SRUdfV1JJVEUgKFBDSV8wX0NPTkZJR19BRERSLCBCSVQzMSB8IHZhbCk7CisKKwkJR1RfUkVHX1JFQUQgKFBDSV8wX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHLCAmc3RhdCk7CisKKwkJR1RfUkVHX1dSSVRFIChQQ0lfMF9DT05GSUdfQUREUiwgQklUMzEgfCB2YWwpOworCQlHVF9SRUdfV1JJVEUgKFBDSV8wX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHLAorCQkJICAgICAgKHN0YXQgJiAweGZmZmYwMDAwKSB8IENGR19QQ0lfSURTRUwpOworCisJfQorCWlmICgoR1RSRUdSRUFEIChQQ0lfMV9NT0RFKSAmIChCSVQ0IHwgQklUNSkpICE9IDApIHsJLyppZiAgUENJLVggKi8KKwkJR1RfUkVHX1dSSVRFIChQQ0lfMV9DT05GSUdfQUREUiwgQklUMzEgfCB2YWwpOworCQlHVF9SRUdfUkVBRCAoUENJXzFfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcsICZzdGF0KTsKKworCQlHVF9SRUdfV1JJVEUgKFBDSV8xX0NPTkZJR19BRERSLCBCSVQzMSB8IHZhbCk7CisJCUdUX1JFR19XUklURSAoUENJXzFfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcsCisJCQkgICAgICAoc3RhdCAmIDB4ZmZmZjAwMDApIHwgQ0ZHX1BDSV9JRFNFTCk7CisJfQorCisJLyogRW5hYmxlIG1hc3RlciAqLworCVBDSV9NQVNURVJfRU5BQkxFICgwLCBTRUxGKTsKKwlQQ0lfTUFTVEVSX0VOQUJMRSAoMSwgU0VMRik7CisKKwkvKiBFbmFibGUgUENJMC8xIE1lbTAgYW5kIElPIDAgZGlzYWJsZSBhbGwgb3RoZXJzICovCisJR1RfUkVHX1JFQUQgKEJBU0VfQUREUl9FTkFCTEUsICZzdGF0KTsKKwlzdGF0IHw9ICgxIDw8IDExKSB8ICgxIDw8IDEyKSB8ICgxIDw8IDEzKSB8ICgxIDw8IDE2KSB8ICgxIDw8IDE3KSB8ICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDE4KTsKKwlzdGF0ICY9IH4oKDEgPDwgOSkgfCAoMSA8PCAxMCkgfCAoMSA8PCAxNCkgfCAoMSA8PCAxNSkpOworCUdUX1JFR19XUklURSAoQkFTRV9BRERSX0VOQUJMRSwgc3RhdCk7CisKKwkvKiByb25lbi0gYWRkIHdyaXRlIHRvIHBjaSByZW1hcCByZWdpc3RlcnMgZm9yIDY0NDYwLgorCSAgIGluIDY0MzYwIHdoZW4gd3JpdGluZyB0byBwY2kgYmFzZSBnbyBhbmQgb3ZlcmlkZSByZW1hcCBhdXRvbWF0aWNhbHksCisJICAgaW4gNjQ0NjAgaXQgZG9lc24ndCAqLworCUdUX1JFR19XUklURSAoUENJXzBfSU9fQkFTRV9BRERSLCBDRkdfUENJMF9JT19CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8wSV9PX0FERFJFU1NfUkVNQVAsIENGR19QQ0kwX0lPX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzBfSU9fU0laRSwgKENGR19QQ0kwX0lPX1NJWkUgLSAxKSA+PiAxNik7CisKKwlHVF9SRUdfV1JJVEUgKFBDSV8wX01FTU9SWTBfQkFTRV9BRERSLCBDRkdfUENJMF9NRU1fQkFTRSA+PiAxNik7CisJR1RfUkVHX1dSSVRFIChQQ0lfME1FTU9SWTBfQUREUkVTU19SRU1BUCwgQ0ZHX1BDSTBfTUVNX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzBfTUVNT1JZMF9TSVpFLCAoQ0ZHX1BDSTBfTUVNX1NJWkUgLSAxKSA+PiAxNik7CisKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX0JBU0VfQUREUiwgQ0ZHX1BDSTFfSU9fQkFTRSA+PiAxNik7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlfT19BRERSRVNTX1JFTUFQLCBDRkdfUENJMV9JT19CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX1NJWkUsIChDRkdfUENJMV9JT19TSVpFIC0gMSkgPj4gMTYpOworCisJR1RfUkVHX1dSSVRFIChQQ0lfMV9NRU1PUlkwX0JBU0VfQUREUiwgQ0ZHX1BDSTFfTUVNX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzFNRU1PUlkwX0FERFJFU1NfUkVNQVAsIENGR19QQ0kxX01FTV9CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX01FTU9SWTBfU0laRSwgKENGR19QQ0kxX01FTV9TSVpFIC0gMSkgPj4gMTYpOworCisJLyogUENJIGludGVyZmFjZSBzZXR0aW5ncyAqLworCS8qIFRpbWVvdXQgc2V0IHRvIHJldHJ5IGZvcmV2ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKFBDSV8wVElNRU9VVF9SRVRSWSwgMHgwKTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xVElNRU9VVF9SRVRSWSwgMHgwKTsKKworCS8qIHJvbmVuIC0gZW5hYmxlIG9ubHkgQ1MwIGFuZCBJbnRlcm5hbCByZWchISAqLworCUdUX1JFR19XUklURSAoUENJXzBCQVNFX0FERFJFU1NfUkVHSVNURVJTX0VOQUJMRSwgMHhmZmZmZmRmZSk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUJBU0VfQUREUkVTU19SRUdJU1RFUlNfRU5BQkxFLCAweGZmZmZmZGZlKTsKKworLypyb25lbiB1cGRhdGUgdGhlIHBjaSBpbnRlcm5hbCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzLiovCisjaWZkZWYgTUFQX1BDSQorCWZvciAoc3RhdCA9IDA7IHN0YXQgPD0gUENJX0hPU1QxOyBzdGF0KyspCisJCXBjaVdyaXRlQ29uZmlnUmVnIChzdGF0LAorCQkJCSAgIFBDSV9JTlRFUk5BTF9SRUdJU1RFUlNfTUVNT1JZX01BUFBFRF9CQVNFX0FERFJFU1MsCisJCQkJICAgU0VMRiwgQ0ZHX0dUX1JFR1MpOworI2VuZGlmCisKK30KKyNlbmRpZgorCisvKiBTZXR1cCBDUFUgaW50ZXJmYWNlIHBhcmFtYXRlcnMgKi8KK3N0YXRpYyB2b2lkIGd0X2NwdV9jb25maWcgKHZvaWQpCit7CisJY3B1X3QgY3B1ID0gZ2V0X2NwdV90eXBlICgpOworCXVsb25nIHRtcDsKKworCS8qIGNwdSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJdG1wID0gR1RSRUdSRUFEIChDUFVfQ09ORklHVVJBVElPTik7CisKKwkvKiBzZXQgdGhlIFNJTkdMRV9DUFUgYml0ICBzZWUgTVY2NDM2MCBQLjM5OSAqLworI2lmbmRlZiBDRkdfR1RfRFVBTF9DUFUJCS8qIFNJTkdMRV9DUFUgc2VlbXMgdG8gY2F1c2UgSlRBRyBwcm9ibGVtcyAqLworCXRtcCB8PSBDUFVfQ09ORl9TSU5HTEVfQ1BVOworI2VuZGlmCisKKwl0bXAgJj0gfkNQVV9DT05GX0FBQ0tfREVMQVlfMjsKKworCXRtcCB8PSBDUFVfQ09ORl9EUF9WQUxJRDsKKwl0bXAgfD0gQ1BVX0NPTkZfQVBfVkFMSUQ7CisKKwl0bXAgfD0gQ1BVX0NPTkZfUElQRUxJTkU7CisKKwlHVF9SRUdfV1JJVEUgKENQVV9DT05GSUdVUkFUSU9OLCB0bXApOwkvKiBNYXJ2ZWxsIChWWFdvcmtzKSB3cml0ZXMgMHgyMDIyMEZGICovCisKKwkvKiBDUFUgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl0bXAgPSBHVFJFR1JFQUQgKENQVV9NQVNURVJfQ09OVFJPTCk7CisKKwl0bXAgfD0gQ1BVX01BU1RfQ1RMX0FSQl9FTjsKKworCWlmICgoY3B1ID09IENQVV83NDAwKSB8fAorCSAgICAoY3B1ID09IENQVV83NDEwKSB8fCAoY3B1ID09IENQVV83NDU1KSB8fCAoY3B1ID09IENQVV83NDUwKSkgeworCisJCXRtcCB8PSBDUFVfTUFTVF9DVExfQ0xFQU5fQkxLOworCQl0bXAgfD0gQ1BVX01BU1RfQ1RMX0ZMVVNIX0JMSzsKKworCX0gZWxzZSB7CisJCS8qIGNsZWFuYmxvY2sgbXVzdCBiZSBjbGVhcmVkIGZvciBDUFVzCisJCSAqIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhpcyBjb21tYW5kICg2MDNlLCA3NTApCisJCSAqIHNlZSBSZXMjMSAqLworCQl0bXAgJj0gfkNQVV9NQVNUX0NUTF9DTEVBTl9CTEs7CisJCXRtcCAmPSB+Q1BVX01BU1RfQ1RMX0ZMVVNIX0JMSzsKKwl9CisJR1RfUkVHX1dSSVRFIChDUFVfTUFTVEVSX0NPTlRST0wsIHRtcCk7Cit9CisKKy8qCisgKiBib2FyZF9wcmVfaW5pdC4KKyAqCisgKiBzZXQgdXAgZ2FsLiBkZXZpY2UgbWFwcGluZ3MsIGV0Yy4KKyAqLworaW50IGJvYXJkX3ByZV9pbml0ICh2b2lkKQoreworCXVjaGFyIHNyYW1fYm9vdCA9IDA7CisKKwkvKgorCSAqIHNldCB1cCB0aGUgR1QgdGhlIHdheSB0aGUga2VybmVsIHdhbnRzIGl0CisJICogdGhlIGNhbGwgdG8gbW92ZSB0aGUgR1QgcmVnaXN0ZXIgc3BhY2Ugd2lsbCBvYnZpb3VzbHkKKwkgKiBmYWlsIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgYnV0IHdlJ3JlIGdvaW5nIHRvIGFzc3VtZQorCSAqIHRoYXQgaWYgaXQncyBub3QgYXQgdGhlIHBvd2VyLW9uIGxvY2F0aW9uLCBpdCdzIHdoZXJlIHdlIHB1dAorCSAqIGl0IGxhc3QgdGltZS4gKGh1YmVyKQorCSAqLworCisJbXlfcmVtYXBfZ3RfcmVncyAoQ0ZHX0RGTF9HVF9SRUdTLCBDRkdfR1RfUkVHUyk7CisKKwkvKiBObyBQQ0kgaW4gZmlyc3QgcmVsZWFzZSBvZiBQb3J0IFRvX2RvOiBlbmFibGUgaXQuICovCisjaWZkZWYgQ09ORklHX1BDSQorCWd0X3BjaV9jb25maWcgKCk7CisjZW5kaWYKKwkvKiBtYXNrIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcyAqLworCUdUX1JFR19XUklURSAoQ1BVX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChDUFVfSU5URVJSVVBUX01BU0tfUkVHSVNURVJfSElHSCwgMCk7CisJLyogbmV3IGluIE1WNjQzNnggKi8KKwlHVF9SRUdfV1JJVEUgKENQVV9JTlRFUlJVUFRfMV9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChDUFVfSU5URVJSVVBUXzFfTUFTS19SRUdJU1RFUl9ISUdILCAwKTsKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlHVF9SRUdfV1JJVEUgKFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfTE9XLCAwKTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfSElHSCwgMCk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlOVEVSUlVQVF9DQVVTRV9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlOVEVSUlVQVF9DQVVTRV9NQVNLX1JFR0lTVEVSX0hJR0gsIDApOworCS8qIGRvZXMgbm90IGV4aXN0IGluIE1WNjQzNngKKwkgICBHVF9SRUdfV1JJVEUoQ1BVX0lOVF8wX01BU0ssIDApOworCSAgIEdUX1JFR19XUklURShDUFVfSU5UXzFfTUFTSywgMCk7CisJICAgR1RfUkVHX1dSSVRFKENQVV9JTlRfMl9NQVNLLCAwKTsKKwkgICBHVF9SRUdfV1JJVEUoQ1BVX0lOVF8zX01BU0ssIDApOworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKwkvKiAtLS0tLSBERVZJQ0UgQlVTIFNFVFRJTkdTIC0tLS0tLSAqLworCisJLyoKKwkgKiBFVkIKKwkgKiAwIC0gU1JBTSAgID8/Pz8KKwkgKiAxIC0gUlRDICAgICAgPz8/PworCSAqIDIgLSBVQVJUICAgICA/Pz8/CisJICogMyAtIEZsYXNoICAgIGNoZWNrZWQgMzJCaXQgSW50ZWwgU3RyYXRhCisJICogYm9vdCAtIEJvb3RDUyBjaGVja2VkIDhCaXQgMjlMVjA0MEIKKwkgKgorCSAqIFp1bWEKKwkgKiAwIC0gRmxhc2gKKwkgKiBib290IC0gQm9vdENTCisJICovCisKKwkvKgorCSAqIHRoZSBkdWFsIDc0NTAgbW9kdWxlIHJlcXVpcmVzIGJ1cnN0IGFjY2VzcyB0byB0aGUgYm9vdAorCSAqIGRldmljZSwgc28gdGhlIHNlcmlhbCByb20gY29waWVzIHRoZSBib290IGRldmljZSB0byB0aGUKKwkgKiBvbi1ib2FyZCBzcmFtIG9uIHRoZSBldmFsIGJvYXJkLCBhbmQgdXBkYXRlcyB0aGUgY29ycmVjdAorCSAqIHJlZ2lzdGVycyB0byBib290IGZyb20gdGhlIHNyYW0uIChkZXZpY2UwKQorCSAqLworCWlmIChtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyAoREVWSUNFMCkgPT0gQ0ZHX0RGTF9CT09UQ1NfQkFTRSkKKwkJc3JhbV9ib290ID0gMTsKKwlpZiAoIXNyYW1fYm9vdCkKKwkJbWVtb3J5TWFwRGV2aWNlU3BhY2UgKERFVklDRTAsIENGR19ERVYwX1NQQUNFLCBDRkdfREVWMF9TSVpFKTsKKworCW1lbW9yeU1hcERldmljZVNwYWNlIChERVZJQ0UxLCBDRkdfREVWMV9TUEFDRSwgQ0ZHX0RFVjFfU0laRSk7CisJbWVtb3J5TWFwRGV2aWNlU3BhY2UgKERFVklDRTIsIENGR19ERVYyX1NQQUNFLCBDRkdfREVWMl9TSVpFKTsKKwltZW1vcnlNYXBEZXZpY2VTcGFjZSAoREVWSUNFMywgQ0ZHX0RFVjNfU1BBQ0UsIENGR19ERVYzX1NJWkUpOworCisKKwkvKiBjb25maWd1cmUgZGV2aWNlIHRpbWluZyAqLworI2lmZGVmIENGR19ERVYwX1BBUgkJLyogc2V0IHBvcnQgcGFyYW1ldGVycyBmb3IgU1JBTSBkZXZpY2UgbW9kdWxlIGFjY2VzcyAqLworCWlmICghc3JhbV9ib290KQorCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CQU5LMFBBUkFNRVRFUlMsIENGR19ERVYwX1BBUik7CisjZW5kaWYKKworI2lmZGVmIENGR19ERVYxX1BBUgkJLyogc2V0IHBvcnQgcGFyYW1ldGVycyBmb3IgUlRDIGRldmljZSBtb2R1bGUgYWNjZXNzICovCisJR1RfUkVHX1dSSVRFIChERVZJQ0VfQkFOSzFQQVJBTUVURVJTLCBDRkdfREVWMV9QQVIpOworI2VuZGlmCisjaWZkZWYgQ0ZHX0RFVjJfUEFSCQkvKiBzZXQgcG9ydCBwYXJhbWV0ZXJzIGZvciBEVUFSVCBkZXZpY2UgbW9kdWxlIGFjY2VzcyAqLworCUdUX1JFR19XUklURSAoREVWSUNFX0JBTksyUEFSQU1FVEVSUywgQ0ZHX0RFVjJfUEFSKTsKKyNlbmRpZgorCisjaWZkZWYgQ0ZHXzMyQklUX0JPT1RfUEFSCS8qIHNldCBwb3J0IHBhcmFtZXRlcnMgZm9yIEZsYXNoIGRldmljZSBtb2R1bGUgYWNjZXNzICovCisJLyogZGV0ZWN0IGlmIHdlIGFyZSBib290aW5nIGZyb20gdGhlIDMyIGJpdCBmbGFzaCAqLworCWlmIChHVFJFR1JFQUQgKERFVklDRV9CT09UX0JBTktfUEFSQU1FVEVSUykgJiAoMHgzIDw8IDIwKSkgeworCQkvKiAzMiBiaXQgYm9vdCBmbGFzaCAqLworCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CQU5LM1BBUkFNRVRFUlMsIENGR184QklUX0JPT1RfUEFSKTsKKwkJR1RfUkVHX1dSSVRFIChERVZJQ0VfQk9PVF9CQU5LX1BBUkFNRVRFUlMsCisJCQkgICAgICBDRkdfMzJCSVRfQk9PVF9QQVIpOworCX0gZWxzZSB7CisJCS8qIDggYml0IGJvb3QgZmxhc2ggKi8KKwkJR1RfUkVHX1dSSVRFIChERVZJQ0VfQkFOSzNQQVJBTUVURVJTLCBDRkdfMzJCSVRfQk9PVF9QQVIpOworCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CT09UX0JBTktfUEFSQU1FVEVSUywgQ0ZHXzhCSVRfQk9PVF9QQVIpOworCX0KKyNlbHNlCisJLyogOCBiaXQgYm9vdCBmbGFzaCBvbmx5ICovCisvKglHVF9SRUdfV1JJVEUoREVWSUNFX0JPT1RfQkFOS19QQVJBTUVURVJTLCBDRkdfOEJJVF9CT09UX1BBUik7Ki8KKyNlbmRpZgorCisKKwlndF9jcHVfY29uZmlnICgpOworCisJLyogTVBQIHNldHVwICovCisJR1RfUkVHX1dSSVRFIChNUFBfQ09OVFJPTDAsIENGR19NUFBfQ09OVFJPTF8wKTsKKwlHVF9SRUdfV1JJVEUgKE1QUF9DT05UUk9MMSwgQ0ZHX01QUF9DT05UUk9MXzEpOworCUdUX1JFR19XUklURSAoTVBQX0NPTlRST0wyLCBDRkdfTVBQX0NPTlRST0xfMik7CisJR1RfUkVHX1dSSVRFIChNUFBfQ09OVFJPTDMsIENGR19NUFBfQ09OVFJPTF8zKTsKKworCUdUX1JFR19XUklURSAoR1BQX0xFVkVMX0NPTlRST0wsIENGR19HUFBfTEVWRUxfQ09OVFJPTCk7CisJREVCVUdfTEVEMF9PTiAoKTsKKwlERUJVR19MRUQxX09OICgpOworCURFQlVHX0xFRDJfT04gKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdmFyaW91cyB0aGluZ3MgdG8gZG8gYWZ0ZXIgcmVsb2NhdGlvbiAqLworCitpbnQgbWlzY19pbml0X3IgKCkKK3sKKwlpY2FjaGVfZW5hYmxlICgpOworI2lmZGVmIENGR19MMgorCWwyY2FjaGVfZW5hYmxlICgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01QU0MKKworCW1wc2Nfc2RtYV9pbml0ICgpOworCW1wc2NfaW5pdDIgKCk7CisjZW5kaWYKKworI2lmIDAKKwkvKiBkaXNhYmxlIHRoZSBkY2FjaGUgYW5kIE1NVSAqLworCWRjYWNoZV9sb2NrICgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWZ0ZXJfcmVsb2MgKHVsb25nIGRlc3RfYWRkciwgZ2RfdCAqIGdkKQoreworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBib290ZWQgZnJvbSB0aGUgc3JhbS4gIElmIHNvLCBtb3ZlIHRoaW5ncworCSAqIGJhY2sgdG8gdGhlIHdheSB0aGV5IHNob3VsZCBiZS4gKHdlJ3JlIHJ1bm5pbmcgZnJvbSBtYWluCisJICogbWVtb3J5IGF0IHRoaXMgcG9pbnQgbm93ICovCisJaWYgKG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChERVZJQ0UwKSA9PSBDRkdfREZMX0JPT1RDU19CQVNFKSB7CisJCW1lbW9yeU1hcERldmljZVNwYWNlIChERVZJQ0UwLCBDRkdfREVWMF9TUEFDRSwgQ0ZHX0RFVjBfU0laRSk7CisJCW1lbW9yeU1hcERldmljZVNwYWNlIChCT09UX0RFVklDRSwgQ0ZHX0RGTF9CT09UQ1NfQkFTRSwgXzhNKTsKKwl9CisJZGlzcGxheV9tZW1fbWFwICgpOworCS8qIG5vdywganVtcCB0byB0aGUgbWFpbiBwcGNib290IGJvYXJkIGluaXQgY29kZSAqLworCWJvYXJkX2luaXRfciAoZ2QsIGRlc3RfYWRkcik7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGVjayBCb2FyZCBJZGVudGl0eToKKyAqCisgKiByaWdodCBub3csIGFzc3VtZSBib3JhZCB0eXBlLiAodGhlcmUgaXMganVzdCBvbmUuLi5hZnRlciBhbGwpCisgKi8KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisJaW50IGxfdHlwZSA9IDA7CisKKwlwcmludGYgKCJCT0FSRDogJXNcbiIsIENGR19CT0FSRF9OQU1FKTsKKwlyZXR1cm4gKGxfdHlwZSk7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkIGRlYnVnX2xlZCAoaW50IGxlZCwgaW50IG1vZGUpCit7CisJdm9sYXRpbGUgaW50ICphZGRyID0gMDsKKwlpbnQgZHVtbXk7CisKKwlpZiAobW9kZSA9PSAxKSB7CisJCXN3aXRjaCAobGVkKSB7CisJCWNhc2UgMDoKKwkJCWFkZHIgPSAoaW50ICopICgodW5zaWduZWQgaW50KSBDRkdfREVWMV9TUEFDRSB8CisJCQkJCTB4MDgwMDApOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJYWRkciA9IChpbnQgKikgKCh1bnNpZ25lZCBpbnQpIENGR19ERVYxX1NQQUNFIHwKKwkJCQkJMHgwYzAwMCk7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlhZGRyID0gKGludCAqKSAoKHVuc2lnbmVkIGludCkgQ0ZHX0RFVjFfU1BBQ0UgfAorCQkJCQkweDEwMDAwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChtb2RlID09IDApIHsKKwkJc3dpdGNoIChsZWQpIHsKKwkJY2FzZSAwOgorCQkJYWRkciA9IChpbnQgKikgKCh1bnNpZ25lZCBpbnQpIENGR19ERVYxX1NQQUNFIHwKKwkJCQkJMHgxNDAwMCk7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlhZGRyID0gKGludCAqKSAoKHVuc2lnbmVkIGludCkgQ0ZHX0RFVjFfU1BBQ0UgfAorCQkJCQkweDE4MDAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWFkZHIgPSAoaW50ICopICgodW5zaWduZWQgaW50KSBDRkdfREVWMV9TUEFDRSB8CisJCQkJCTB4MWMwMDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkdW1teSA9ICphZGRyOworfQorCitpbnQgZGlzcGxheV9tZW1fbWFwICh2b2lkKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGludCBiYXNlLCBzaXplLCB3aWR0aDsKKworCS8qIFNEUkFNICovCisJcHJpbnRmICgiU0QgKEREUikgUkFNXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEJBTkszOyBpKyspIHsKKwkJYmFzZSA9IG1lbW9yeUdldEJhbmtCYXNlQWRkcmVzcyAoaSk7CisJCXNpemUgPSBtZW1vcnlHZXRCYW5rU2l6ZSAoaSk7CisJCWlmIChzaXplICE9IDApIHsKKwkJCXByaW50ZiAoIkJBTkslZDogYmFzZSAtIDB4JTA4eFx0c2l6ZSAtICVkTSBieXRlc1xuIiwKKwkJCQlpLCBiYXNlLCBzaXplID4+IDIwKTsKKwkJfQorCX0KKworCS8qIENQVSdzIFBDSSB3aW5kb3dzICovCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfSE9TVDE7IGkrKykgeworCQlwcmludGYgKCJcbkNQVSdzIFBDSSAlZCB3aW5kb3dzXG4iLCBpKTsKKwkJYmFzZSA9IHBjaUdldFNwYWNlQmFzZSAoaSwgUENJX0lPKTsKKwkJc2l6ZSA9IHBjaUdldFNwYWNlU2l6ZSAoaSwgUENJX0lPKTsKKwkJcHJpbnRmICgiICAgICAgSU86IGJhc2UgLSAweCUwOHhcdHNpemUgLSAlZE0gYnl0ZXNcbiIsIGJhc2UsCisJCQlzaXplID4+IDIwKTsKKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDw9CisJCSAgICAgUENJX1JFR0lPTjAKKwkJICAgICAvKnJvbmVuIGN1cnJlbnRseSBvbmx5IGZpcnN0IFBDSSBNRU0gaXMgdXNlZCAzICovIDsKKwkJICAgICBqKyspIHsKKwkJCWJhc2UgPSBwY2lHZXRTcGFjZUJhc2UgKGksIGopOworCQkJc2l6ZSA9IHBjaUdldFNwYWNlU2l6ZSAoaSwgaik7CisJCQlwcmludGYgKCJNRU1PUlkgJWQ6IGJhc2UgLSAweCUwOHhcdHNpemUgLSAlZE0gYnl0ZXNcbiIsIGosIGJhc2UsIHNpemUgPj4gMjApOworCQl9CisJfQorCisJLyogRGV2aWNlcyAqLworCXByaW50ZiAoIlxuREVWSUNFU1xuIik7CisJZm9yIChpID0gMDsgaSA8PSBERVZJQ0UzOyBpKyspIHsKKwkJYmFzZSA9IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChpKTsKKwkJc2l6ZSA9IG1lbW9yeUdldERldmljZVNpemUgKGkpOworCQl3aWR0aCA9IG1lbW9yeUdldERldmljZVdpZHRoIChpKSAqIDg7CisJCXByaW50ZiAoIkRFViAlZDogIGJhc2UgLSAweCUwOHggIHNpemUgLSAlZE0gYnl0ZXNcdHdpZHRoIC0gJWQgYml0cyIsIGksIGJhc2UsIHNpemUgPj4gMjAsIHdpZHRoKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXByaW50ZiAoIlx0LSBFWFQgU1JBTSAoYWN0dWFsIC0gMU0pXG4iKTsKKwkJZWxzZSBpZiAoaSA9PSAxKQorCQkJcHJpbnRmICgiXHQtIFJUQ1xuIik7CisJCWVsc2UgaWYgKGkgPT0gMikKKwkJCXByaW50ZiAoIlx0LSBVQVJUXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiXHQtIExBUkdFIEZMQVNIXG4iKTsKKwl9CisKKwkvKiBCb290cm9tICovCisJYmFzZSA9IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChCT09UX0RFVklDRSk7CS8qIEJvb3QgKi8KKwlzaXplID0gbWVtb3J5R2V0RGV2aWNlU2l6ZSAoQk9PVF9ERVZJQ0UpOworCXdpZHRoID0gbWVtb3J5R2V0RGV2aWNlV2lkdGggKEJPT1RfREVWSUNFKSAqIDg7CisJcHJpbnRmICgiIEJPT1Q6ICBiYXNlIC0gMHglMDh4ICBzaXplIC0gJWRNIGJ5dGVzXHR3aWR0aCAtICVkIGJpdHNcbiIsCisJCWJhc2UsIHNpemUgPj4gMjAsIHdpZHRoKTsKKwlyZXR1cm4gKDApOworfQorCisvKiBEUkFNIGNoZWNrIHJvdXRpbmVzIGNvcGllZCBmcm9tIGd3ODI2MCAqLworCisjaWYgZGVmaW5lZCAoQ0ZHX0RSQU1fVEVTVCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICBtb3ZlNjQoKSAtICBtb3ZlcyBhIGRvdWJsZSB3b3JkICg2NC1iaXQpCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogREVTQ1JJUFRJT046CQkJCQkJCSAgICAgKi8KKy8qICAgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRvdWJsZSB3b3JkIG1vdmUgZnJvbSB0aGUgZGF0YSBhdAkgICAgICovCisvKiAgIHRoZSBzb3VyY2UgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gYXQgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIuICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIElOUFVUUzoJCQkJCQkJICAgICAqLworLyogICB1bnNpZ25lZCBsb25nIGxvbmcgKnNyYyAgLSBwb2ludGVyIHRvIGRhdGEgdG8gbW92ZQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0IC0gcG9pbnRlciB0byBsb2NhdGUgdG8gbW92ZSBkYXRhCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVRVUk5TOgkJCQkJCQkgICAgICovCisvKiAgIE5vbmUJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFU1RSSUNUSU9OUy9MSU1JVEFUSU9OUzoJCQkJCSAgICAgKi8KKy8qICAgTWF5IGNsb29iZXIgZnIwLgkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbW92ZTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgKnNyYywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQoreworCWFzbSAoImxmZCAgMCwgMCgzKVxuXHQiCS8qIGZwcjAgICA9ICAqc2NyICAgICAgICovCisJICAgICAic3RmZCAwLCAwKDQpIgkvKiAqZGVzdCAgPSAgZnByMCAgICAgICAqLworICAgICAgOiA6IDogImZyMCIpOwkJLyogQ2xvYmJlcnMgZnIwICAgICAgICAgKi8KKwlyZXR1cm47Cit9CisKKworI2lmIGRlZmluZWQgKENGR19EUkFNX1RFU1RfREFUQSkKKwordW5zaWduZWQgbG9uZyBsb25nIHBhdHRlcm5bXSA9IHsKKwkweGFhYWFhYWFhYWFhYWFhYWEsCisJMHhjY2NjY2NjY2NjY2NjY2NjLAorCTB4ZjBmMGYwZjBmMGYwZjBmMCwKKwkweGZmMDBmZjAwZmYwMGZmMDAsCisJMHhmZmZmMDAwMGZmZmYwMDAwLAorCTB4ZmZmZmZmZmYwMDAwMDAwMCwKKwkweDAwMDAwMDAwZmZmZmZmZmYsCisJMHgwMDAwZmZmZjAwMDBmZmZmLAorCTB4MDBmZjAwZmYwMGZmMDBmZiwKKwkweDBmMGYwZjBmMGYwZjBmMGYsCisJMHgzMzMzMzMzMzMzMzMzMzMzLAorCTB4NTU1NTU1NTU1NTU1NTU1NQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICBtZW1fdGVzdF9kYXRhKCkgLSAgdGVzdCBkYXRhIGxpbmVzIGZvciBzaG9ydHMgYW5kIG9wZW5zICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogREVTQ1JJUFRJT046CQkJCQkJCSAgICAgKi8KKy8qICAgVGVzdHMgZGF0YSBsaW5lcyBmb3Igc2hvcnRzIGFuZCBvcGVucyBieSBmb3JjaW5nIGFkamFjZW50IGRhdGEgICovCisvKiAgIHRvIG9wcG9zaXRlIHN0YXRlcy4gQmVjYXVzZSB0aGUgZGF0YSBsaW5lcyBjb3VsZCBiZSByb3V0ZWQgaW4gICAqLworLyogICBhbiBhcmJpdHJhcnkgbWFubmVyIHRoZSBtdXN0IGVuc3VyZSB0ZXN0IHBhdHRlcm5zIGVuc3VyZSB0aGF0ICAgKi8KKy8qICAgZXZlcnkgY2FzZSBpcyB0ZXN0ZWQuIEJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIGJpbmFyeSAgICovCisvKiAgIHBhdHRlcm5zIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIGFkamFjZW50IGJpdHMgaXMgdGVzdCByZWdhcmRsZXNzICAqLworLyogICBvZiByb3V0aW5nLgkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgICAgLi4uMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwCQkJCSAgICAgKi8KKy8qICAgICAuLi4xMTAwMTEwMDExMDAxMTAwMTEwMDExMDAJCQkJICAgICAqLworLyogICAgIC4uLjExMTEwMDAwMTExMTAwMDAxMTExMDAwMAkJCQkgICAgICovCisvKiAgICAgLi4uMTExMTExMTEwMDAwMDAwMDExMTExMTExCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgIENhcnJ5aW5nIHRoaXMgb3V0LCBnaXZlcyB1cyBzaXggaGV4IHBhdHRlcm5zIGFzIGZvbGxvd3M6CSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgICAgMHhhYWFhYWFhYWFhYWFhYWFhCQkJCQkgICAgICovCisvKiAgICAgMHhjY2NjY2NjY2NjY2NjY2NjCQkJCQkgICAgICovCisvKiAgICAgMHhmMGYwZjBmMGYwZjBmMGYwCQkJCQkgICAgICovCisvKiAgICAgMHhmZjAwZmYwMGZmMDBmZjAwCQkJCQkgICAgICovCisvKiAgICAgMHhmZmZmMDAwMGZmZmYwMDAwCQkJCQkgICAgICovCisvKiAgICAgMHhmZmZmZmZmZjAwMDAwMDAwCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogICBUaGUgbnVtYmVyIHRlc3QgcGF0dGVybnMgd2lsbCBhbHdheXMgYmUgZ2l2ZW4gYnk6CQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogICBsb2coYmFzZSAyKShudW1iZXIgZGF0YSBiaXRzKSA9IGxvZzIgKDY0KSA9IDYJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgIFRvIHRlc3QgZm9yIHNob3J0IGFuZCBvcGVucyB0byBvdGhlciBzaWduYWxzIG9uIG91ciBib2FyZHMuIHdlICAqLworLyogICBzaW1wbHkJCQkJCQkJICAgICAqLworLyogICB0ZXN0IHdpdGggdGhlIDEncyBjb21wbGVtbnQgb2YgdGhlIHBhdGVybnMgYXMgd2VsbC4JICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgRGlzcGxheXMgZmFpbGluZyB0ZXN0IHBhdHRlcm4JCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKiAgQXNzdW1lcyBvbmx5IG9uZSBvbmUgU0RSQU0gYmFuawkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtZW1fdGVzdF9kYXRhICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyAqcG1lbSA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKikgQ0ZHX01FTVRFU1RfU1RBUlQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHRlbXA2NDsKKwlpbnQgbnVtX3BhdHRlcm5zID0gc2l6ZW9mIChwYXR0ZXJuKSAvIHNpemVvZiAocGF0dGVyblswXSk7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGhpLCBsbzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0dGVybnM7IGkrKykgeworCQltb3ZlNjQgKCYocGF0dGVybltpXSksIHBtZW0pOworCQltb3ZlNjQgKHBtZW0sICZ0ZW1wNjQpOworCisJCS8qIGhpID0gKHRlbXA2ND4+MzIpICYgMHhmZmZmZmZmZjsgICAgICAgICAgKi8KKwkJLyogbG8gPSB0ZW1wNjQgJiAweGZmZmZmZmZmOyAgICAgICAgICAgICAgICAqLworCQkvKiBwcmludGYoIlxudGVtcDY0ID0gMHglMDh4JTA4eCIsIGhpLCBsbyk7ICovCisKKwkJaGkgPSAocGF0dGVybltpXSA+PiAzMikgJiAweGZmZmZmZmZmOworCQlsbyA9IHBhdHRlcm5baV0gJiAweGZmZmZmZmZmOworCQkvKiBwcmludGYoIlxucGF0dGVyblslZF0gPSAweCUwOHglMDh4IiwgaSwgaGksIGxvKTsgICovCisKKwkJaWYgKHRlbXA2NCAhPSBwYXR0ZXJuW2ldKSB7CisJCQlwcmludGYgKCJcbiAgIERhdGEgVGVzdCBGYWlsZWQsIHBhdHRlcm4gMHglMDh4JTA4eCIsCisJCQkJaGksIGxvKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ0ZHX0RSQU1fVEVTVF9EQVRBICovCisKKyNpZiBkZWZpbmVkIChDRkdfRFJBTV9URVNUX0FERFJFU1MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogIG1lbV90ZXN0X2FkZHJlc3MoKSAtCXRlc3QgYWRkcmVzcyBsaW5lcwkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSB0ZXN0IHRvIHZlcmlmeSB0aGF0IGVhY2ggd29yZCBpbQkgICAgICovCisvKiAgIG1lbW9yeSBpcyB1bmlxdWx5IGFkZHJlc3NhYmxlLiBUaGUgdGVzdCBzZXF1ZW5jZSBpcyBhcyBmb2xsb3dzOiAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qICAgMSkgd3JpdGUgdGhlIGFkZHJlc3Mgb2YgZWFjaCB3b3JkIHRvIGVhY2ggd29yZC4JCSAgICAgKi8KKy8qICAgMikgdmVyaWZ5IHRoYXQgZWFjaCBsb2NhdGlvbiBlcXVhbHMgaXRzIGFkZHJlc3MJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBPVVRQVVRTOgkJCQkJCQkgICAgICovCisvKiAgIERpc3BsYXlzIGZhaWxpbmcgdGVzdCBwYXR0ZXJuIGFuZCBhZGRyZXNzCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX3Rlc3RfYWRkcmVzcyAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnBtZW0gPQorCQkodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIENGR19NRU1URVNUX1NUQVJUOworCWNvbnN0IHVuc2lnbmVkIGludCBzaXplID0gKENGR19NRU1URVNUX0VORCAtIENGR19NRU1URVNUX1NUQVJUKSAvIDQ7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiB3cml0ZSBhZGRyZXNzIHRvIGVhY2ggbG9jYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXBtZW1baV0gPSBpOworCX0KKworCS8qIHZlcmlmeSBlYWNoIGxvYWN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAocG1lbVtpXSAhPSBpKSB7CisJCQlwcmludGYgKCJcbiAgIEFkZHJlc3MgVGVzdCBGYWlsZWQgYXQgMHgleCIsIGkpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ0ZHX0RSQU1fVEVTVF9BRERSRVNTICovCisKKyNpZiBkZWZpbmVkIChDRkdfRFJBTV9URVNUX1dBTEspCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogICBtZW1fbWFyY2goKSAtICBtZW1vcnkgbWFyY2gJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIE1hcmNoZXMgdXAgdGhyb3VnaCBtZW1vcnkuIEF0IGVhY2ggbG9jYXRpb24gdmVyaWZpZXMgcm1hc2sgaWYgICAqLworLyogICByZWFkID0gMS4gQXQgZWFjaCBsb2NhdGlvbiB3cml0ZSB3bWFzayBpZgl3cml0ZSA9IDEuIERpc3BsYXlzICAqLworLyogICBmYWlsaW5nIGFkZHJlc3MgYW5kIHBhdHRlcm4uCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBJTlBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICogYmFzZSAtIHN0YXJ0IGFkZHJlc3Mgb2YgdGVzdAkgICAgICovCisvKiAgIHVuc2lnbmVkIGludCBzaXplIC0gbnVtYmVyIG9mIGR3b3Jkcyg2NC1iaXQpIHRvIHRlc3QJICAgICAqLworLyogICB1bnNpZ25lZCBsb25nIGxvbmcgcm1hc2sgLSByZWFkIHZlcmlmeSBtYXNrCQkgICAgICovCisvKiAgIHVuc2lnbmVkIGxvbmcgbG9uZyB3bWFzayAtIHdydGllIHZlcmlmeSBtYXNrCQkgICAgICovCisvKiAgIHNob3J0IHJlYWQgLSB2ZXJpZmllcyBybWFzayBpZiByZWFkID0gMQkJCSAgICAgKi8KKy8qICAgc2hvcnQgd3JpdGUgIC0gd3JpdGVzIHdtYXNrIGlmIHdyaXRlID0gMQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBPVVRQVVRTOgkJCQkJCQkgICAgICovCisvKiAgIERpc3BsYXlzIGZhaWxpbmcgdGVzdCBwYXR0ZXJuIGFuZCBhZGRyZXNzCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX21hcmNoICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKmJhc2UsCisJICAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcm1hc2ssCisJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB3bWFzaywgc2hvcnQgcmVhZCwgc2hvcnQgd3JpdGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisJdW5zaWduZWQgaW50IGhpdGVtcCwgbG90ZW1wLCBoaW1hc2ssIGxvbWFzazsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKHJlYWQgIT0gMCkgeworCQkJLyogdGVtcCA9IGJhc2VbaV07ICovCisJCQltb3ZlNjQgKCh1bnNpZ25lZCBsb25nIGxvbmcgKikgJihiYXNlW2ldKSwgJnRlbXApOworCQkJaWYgKHJtYXNrICE9IHRlbXApIHsKKwkJCQloaXRlbXAgPSAodGVtcCA+PiAzMikgJiAweGZmZmZmZmZmOworCQkJCWxvdGVtcCA9IHRlbXAgJiAweGZmZmZmZmZmOworCQkJCWhpbWFzayA9IChybWFzayA+PiAzMikgJiAweGZmZmZmZmZmOworCQkJCWxvbWFzayA9IHJtYXNrICYgMHhmZmZmZmZmZjsKKworCQkJCXByaW50ZiAoIlxuIFdhbGtpbmcgb25lJ3MgdGVzdCBmYWlsZWQ6IGFkZHJlc3MgPSAweCUwOHgsIiAiXG5cdGV4cGVjdGVkIDB4JTA4eCUwOHgsIGZvdW5kIDB4JTA4eCUwOHgiLCBpIDw8IDMsIGhpbWFzaywgbG9tYXNrLCBoaXRlbXAsIGxvdGVtcCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJaWYgKHdyaXRlICE9IDApIHsKKwkJCS8qICBiYXNlW2ldID0gd21hc2s7ICovCisJCQltb3ZlNjQgKCZ3bWFzaywgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAmKGJhc2VbaV0pKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDRkdfRFJBTV9URVNUX1dBTEsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICAgbWVtX3Rlc3Rfd2FsaygpIC0gIGEgc2ltcGxlIHdhbGtpbmcgb25lcyB0ZXN0CSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBERVNDUklQVElPTjoJCQkJCQkJICAgICAqLworLyogICBQZXJmb3JtcyBhIHdhbGtpbmcgb25lcyB0aHJvdWdoIGVudGlyZSBwaHlzaWNhbCBtZW1vcnkuIFRoZSAgICAgKi8KKy8qICAgdGVzdCB1c2VzIGFzIHNlcmllcyBvZiBtZW1vcnkgbWFyY2hlcywgbWVtX21hcmNoKCksIHRvIHZlcmlmeSAgICovCisvKiAgIGFuZCB3cml0ZSB0aGUgdGVzdCBwYXR0ZXJucyB0byBtZW1vcnkuIFRoZSB0ZXN0IHNlcXVlbmNlIGlzIGFzICAqLworLyogICBmb2xsb3dzOgkJCQkJCQkgICAgICovCisvKiAgICAgMSkgbWFyY2ggd3JpdGluZyAwMDAwLi4uMDAwMQkJCQkgICAgICovCisvKiAgICAgMikgbWFyY2ggdmVyaWZ5aW5nIDAwMDAuLi4wMDAxICAsIHdyaXRpbmcgIDAwMDAuLi4wMDEwCSAgICAgKi8KKy8qICAgICAzKSByZXBlYXQgc3RlcCAyIHNoaWZ0aW5nIG1hc2tzIGxlZnQgMSBiaXQgZWFjaCB0aW1lIHVuaXRsICAgICovCisvKgkgICB0aGUgd3JpdGUgbWFzayBlcXVhbHMgMTAwMC4uLjAwMDAJCQkgICAgICovCisvKiAgICAgNCkgbWFyY2ggdmVyaWZ5aW5nIDEwMDAuLi4wMDAwCQkJCSAgICAgKi8KKy8qICAgVGhlIHRlc3QgZmFpbHMgaWYgYW55IG9mIHRoZSBtZW1vcnkgbWFyY2hlcyByZXR1cm4gYSBmYWlsdXJlLiAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogT1VUUFVUUzoJCQkJCQkJICAgICAqLworLyogICBEaXNwbGF5cyB3aGljaCBwYXNzIG9uIHRoZSBtZW1vcnkgdGVzdCBpcyBleGVjdXRpbmcJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX3Rlc3Rfd2FsayAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWFzazsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKnBtZW0gPQorCQkodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICopIENGR19NRU1URVNUX1NUQVJUOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2l6ZSA9IChDRkdfTUVNVEVTVF9FTkQgLSBDRkdfTUVNVEVTVF9TVEFSVCkgLyA4OworCisJdW5zaWduZWQgaW50IGk7CisKKwltYXNrID0gMHgwMTsKKworCXByaW50ZiAoIkluaXRpYWwgUGFzcyIpOworCW1lbV9tYXJjaCAocG1lbSwgc2l6ZSwgMHgwLCAweDEsIDAsIDEpOworCisJcHJpbnRmICgiXGJcYlxiXGJcYlxiXGJcYlxiXGJcYlxiIik7CisJcHJpbnRmICgiCQkiKTsKKwlwcmludGYgKCIgICAgICAgICAiKTsKKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKworCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKSB7CisJCXByaW50ZiAoIlBhc3MgJTJkIiwgaSArIDIpOworCQlpZiAobWVtX21hcmNoIChwbWVtLCBzaXplLCBtYXNrLCBtYXNrIDw8IDEsIDEsIDEpICE9IDApIHsKKwkJCS8qcHJpbnRmKCJtYXNrOiAweCV4LCBwYXNzOiAlZCwgIiwgbWFzaywgaSk7ICovCisJCQlyZXR1cm4gMTsKKwkJfQorCQltYXNrID0gbWFzayA8PCAxOworCQlwcmludGYgKCJcYlxiXGJcYlxiXGJcYiIpOworCX0KKworCXByaW50ZiAoIkxhc3QgUGFzcyIpOworCWlmIChtZW1fbWFyY2ggKHBtZW0sIHNpemUsIDAsIG1hc2ssIDAsIDEpICE9IDApIHsKKwkJLyogcHJpbnRmKCJtYXNrOiAweCV4IiwgbWFzayk7ICovCisJCXJldHVybiAxOworCX0KKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKwlwcmludGYgKCIJICAgICAiKTsKKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogICAgdGVzdGRyYW0oKSAtICBjYWxscyBhbnkgZW5hYmxlZCBtZW1vcnkgdGVzdHMJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIFJ1bnMgbWVtb3J5IHRlc3RzIGlmIHRoZSBlbnZpcm9ubWVudCB0ZXN0IHZhcmlhYmxlcyBhcmUgc2V0IHRvICAqLworLyogICAneScuCQkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBJTlBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdGVzdGRyYW1kYXRhICAgIC0gSWYgc2V0IHRvICd5JywgZGF0YSB0ZXN0IGlzIHJ1bi4JCSAgICAgKi8KKy8qICAgdGVzdGRyYW1hZGRyZXNzIC0gSWYgc2V0IHRvICd5JywgYWRkcmVzcyB0ZXN0IGlzIHJ1bi4JICAgICAqLworLyogICB0ZXN0ZHJhbXdhbGsgICAgLSBJZiBzZXQgdG8gJ3knLCB3YWxraW5nIG9uZXMgdGVzdCBpcyBydW4JICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgTm9uZQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogUkVUVVJOUzoJCQkJCQkJICAgICAqLworLyogICAwIC0gIFBhc3NlZCB0ZXN0CQkJCQkJICAgICAqLworLyogICAxIC0gIEZhaWxlZCB0ZXN0CQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFU1RSSUNUSU9OUy9MSU1JVEFUSU9OUzoJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwljaGFyICpzOworCWludCBydW5kYXRhLCBydW5hZGRyZXNzLCBydW53YWxrOworCisJcyA9IGdldGVudiAoInRlc3RkcmFtZGF0YSIpOworCXJ1bmRhdGEgPSAocyAmJiAoKnMgPT0gJ3knKSkgPyAxIDogMDsKKwlzID0gZ2V0ZW52ICgidGVzdGRyYW1hZGRyZXNzIik7CisJcnVuYWRkcmVzcyA9IChzICYmICgqcyA9PSAneScpKSA/IDEgOiAwOworCXMgPSBnZXRlbnYgKCJ0ZXN0ZHJhbXdhbGsiKTsKKwlydW53YWxrID0gKHMgJiYgKCpzID09ICd5JykpID8gMSA6IDA7CisKKy8qICAgIHJ1bmRhdGEgPSAxOyAqLworLyogICAgcnVuYWRkcmVzcyA9IDA7ICovCisvKiAgICBydW53YWxrID0gMDsgKi8KKworCWlmICgocnVuZGF0YSA9PSAxKSB8fCAocnVuYWRkcmVzcyA9PSAxKSB8fCAocnVud2FsayA9PSAxKSkgeworCQlwcmludGYgKCJUZXN0aW5nIFJBTSBmcm9tIDB4JTA4eCB0byAweCUwOHggLi4uICAoZG9uJ3QgcGFuaWMuLi4gdGhhdCB3aWxsIHRha2UgYSBtb21lbnQgISEhISlcbiIsIENGR19NRU1URVNUX1NUQVJULCBDRkdfTUVNVEVTVF9FTkQpOworCX0KKyNpZmRlZiBDRkdfRFJBTV9URVNUX0RBVEEKKwlpZiAocnVuZGF0YSA9PSAxKSB7CisJCXByaW50ZiAoIlRlc3QgREFUQSAuLi4gICIpOworCQlpZiAobWVtX3Rlc3RfZGF0YSAoKSA9PSAxKSB7CisJCQlwcmludGYgKCJmYWlsZWQgXG4iKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCXByaW50ZiAoIm9rIFxuIik7CisJfQorI2VuZGlmCisjaWZkZWYgQ0ZHX0RSQU1fVEVTVF9BRERSRVNTCisJaWYgKHJ1bmFkZHJlc3MgPT0gMSkgeworCQlwcmludGYgKCJUZXN0IEFERFJFU1MgLi4uICAiKTsKKwkJaWYgKG1lbV90ZXN0X2FkZHJlc3MgKCkgPT0gMSkgeworCQkJcHJpbnRmICgiZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlwcmludGYgKCJvayBcbiIpOworCX0KKyNlbmRpZgorI2lmZGVmIENGR19EUkFNX1RFU1RfV0FMSworCWlmIChydW53YWxrID09IDEpIHsKKwkJcHJpbnRmICgiVGVzdCBXQUxLSU5HIE9ORXMgLi4uICAiKTsKKwkJaWYgKG1lbV90ZXN0X3dhbGsgKCkgPT0gMSkgeworCQkJcHJpbnRmICgiZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlwcmludGYgKCJvayBcbiIpOworCX0KKyNlbmRpZgorCWlmICgocnVuZGF0YSA9PSAxKSB8fCAocnVuYWRkcmVzcyA9PSAxKSB8fCAocnVud2FsayA9PSAxKSkgeworCQlwcmludGYgKCJwYXNzZWRcbiIpOworCX0KKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8qIENGR19EUkFNX1RFU1QgKi8KKworLyogcm9uZW4gLSB0aGUgYmVsb3cgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IHRoZSBib290bSBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qICAtIHdlIG1hcCB0aGUgYmFzZSByZWdpc3RlciB0byBmYmUwMDAwMCAoc2FtZSBtYXBwaW5nIGFzIGluIHRoZSBMU1ApICovCisvKiAgLSB3ZSB0dXJuIG9mZiB0aGUgUlggZ2lnIGRtYXMgLSB0byBwcmV2ZW50IHRoZSBkbWEgZnJvbSBvdmVydW5uaW5nICAqLworLyogICAgdGhlIGtlcm5lbCBkYXRhIGFyZWFzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAtIHdlIGRpYWJsZSBhbmQgaW52YWxpZGF0ZSB0aGUgaWNhY2hlIGFuZCBkY2FjaGUuICAgICAgICAgICAgICAgICAgICovCit2b2lkIG15X3JlbWFwX2d0X3JlZ3NfYm9vdG0gKHUzMiBjdXJfbG9jLCB1MzIgbmV3X2xvYykKK3sKKwl1MzIgdGVtcDsKKworCXRlbXAgPSBpbl9sZTMyICgodTMyICopIChuZXdfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSk7CisJaWYgKCh0ZW1wICYgMHhmZmZmKSA9PSBuZXdfbG9jID4+IDE2KQorCQlyZXR1cm47CisKKwl0ZW1wID0gKGluX2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMTYpOworCisJb3V0X2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpLCB0ZW1wKTsKKworCXdoaWxlICgoV09SRF9TV0FQICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKE5PTkVfQ0FDSEVBQkxFIHwKKwkJCQkJCQluZXdfbG9jIHwKKwkJCQkJCQkoSU5URVJOQUxfU1BBQ0VfREVDT0RFKSkpKSkKKwkgICAgICAgIT0gdGVtcCk7CisKK30KKwordm9pZCBib2FyZF9wcmVib290bV9pbml0ICgpCit7CisKKy8qIGNoYW5nZSB3aW5kb3cgc2l6ZSBvZiBQQ0kxIElPIGluIG9yZGVyIHRwIHByZXZlbnQgb3ZlcmxhcGluZyB3aXRoIFJFRyBCQVNFLiAqLworCQlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX1NJWkUsIChfNjRLIC0gMSkgPj4gMTYpOworCisvKiBTdG9wIEdpZ0UgUnggRE1BIGVuZ2luZXMgKi8KKwlHVF9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKDApLCAweDAwMDBmZjAwKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKDEpLCAweDAwMDBmZjAwKTsKKy8qIE1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRygyKSwgMHgwMDAwZmYwMCk7ICovCisKKy8qIFJlbG9jYXRlIE1WNjQzNjAgaW50ZXJuYWwgcmVncyAqLworCW15X3JlbWFwX2d0X3JlZ3NfYm9vdG0gKENGR19HVF9SRUdTLCBCUklER0VfUkVHX0JBU0VfQk9PVE0pOworCisJaWNhY2hlX2Rpc2FibGUgKCk7CisJaW52YWxpZGF0ZV9sMV9pbnN0cnVjdGlvbl9jYWNoZSAoKTsKKwlmbHVzaF9kYXRhX2NhY2hlICgpOworCWRjYWNoZV9kaXNhYmxlICgpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL2V0aC5oIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL2V0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjMyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvZXRoLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIGV0aC5oIC0gaGVhZGVyIGZpbGUgZm9yIHRoZSBwb2xsZWQgbW9kZSBHVCBldGhlcm5ldCBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9fRVZCNjQzNjBfRVRIX0hfXworI2RlZmluZSBfX0VWQjY0MzYwX0VUSF9IX18KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKworCitpbnQgZGI2NDM2MF9ldGgwX3BvbGwodm9pZCk7CitpbnQgZGI2NDM2MF9ldGgwX3RyYW5zbWl0KHVuc2lnbmVkIGludCBzLCB2b2xhdGlsZSBjaGFyICpwKTsKK3ZvaWQgZGI2NDM2MF9ldGgwX2Rpc2FibGUodm9pZCk7Citib29sIG5ldHdvcmtfc3RhcnQoYmRfdCAqYmlzKTsKKworCisjZW5kaWYgLyogX19FVkI2NDM2MF9FVEhfSF9fICovCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvbXBzYy5jIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL21wc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IzYWRjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL21wc2MuYwpAQCAtMCwwICsxLDEwMTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvaG4gQ2xlbWVucyA8Y2xlbWVuc0BtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2hhbmdlcyBmb3IgTWFydmVsbCBEQjY0MzYwIGV2YWwgYm9hcmQgMjAwMyBieSBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBtcHNjLmMgLSBkcml2ZXIgZm9yIGNvbnNvbGUgb3ZlciB0aGUgTVBTQy4KKyAqLworCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgIm1wc2MuaCIKKworI2luY2x1ZGUgIm12X3JlZ3MuaCIKKworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWVtb3J5LmgiCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgTVBTQyBhcyBhIHJlZ2lzdGVyIGJhc2VkIFVBUlQuCisgKiBUaGlzIHdpbGwgZm9yY2UgdGhlIHNlcmlhbCBwb3J0IHRvIG5vdCB1c2UgdGhlIFNETUEgZW5naW5lIGF0IGFsbC4KKyAqLworI3VuZGVmIENPTkZJR19NUFNDX0RFQlVHX1BPUlQKKworCitpbnQgKCptcHNjX3B1dGNoYXIpIChjaGFyIGNoKSA9IG1wc2NfcHV0Y2hhcl9lYXJseTsKK2NoYXIgKCptcHNjX2dldGNoYXIpICh2b2lkKSA9IG1wc2NfZ2V0Y2hhcl9kZWJ1ZzsKK2ludCAoKm1wc2NfdGVzdF9jaGFyKSAodm9pZCkgPSBtcHNjX3Rlc3RfY2hhcl9kZWJ1ZzsKKworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50ICpyeF9kZXNjX2Jhc2UgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGludCByeF9kZXNjX2luZGV4ID0gMDsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnR4X2Rlc2NfYmFzZSA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgaW50IHR4X2Rlc2NfaW5kZXggPSAwOworCisvKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgZ2FsbXBzY19jb25uZWN0IChpbnQgY2hhbm5lbCwgaW50IGNvbm5lY3QpOworc3RhdGljIGludCBnYWxtcHNjX3JvdXRlX3J4X2Nsb2NrIChpbnQgY2hhbm5lbCwgaW50IGJyZyk7CitzdGF0aWMgaW50IGdhbG1wc2Nfcm91dGVfdHhfY2xvY2sgKGludCBjaGFubmVsLCBpbnQgYnJnKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY193cml0ZV9jb25maWdfcmVncyAoaW50IG1wc2MsIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19jb25maWdfY2hhbm5lbF9yZWdzIChpbnQgbXBzYyk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X2NoYXJfbGVuZ3RoIChpbnQgbXBzYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfc3RvcF9iaXRfbGVuZ3RoIChpbnQgbXBzYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfcGFyaXR5IChpbnQgbXBzYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19lbnRlcl9odW50IChpbnQgbXBzYyk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X2Jya2NudCAoaW50IG1wc2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X3Rjc2NoYXIgKGludCBtcHNjLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBnYWxtcHNjX3NldF9zbm9vcCAoaW50IG1wc2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2h1dGRvd24gKGludCBtcHNjKTsKKworc3RhdGljIGludCBnYWxzZG1hX3NldF9SRlQgKGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfU0ZNIChpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X3J4bGUgKGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfdHhsZSAoaW50IGNoYW5uZWwpOworc3RhdGljIGludCBnYWxzZG1hX3NldF9idXJzdHNpemUgKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworc3RhdGljIGludCBnYWxzZG1hX3NldF9SQyAoaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCB2YWx1ZSk7CisKK3N0YXRpYyBpbnQgZ2FsYnJnX3NldF9DRFYgKGludCBjaGFubmVsLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBnYWxicmdfZW5hYmxlIChpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW50IGdhbGJyZ19kaXNhYmxlIChpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW50IGdhbGJyZ19zZXRfY2xrc3JjIChpbnQgY2hhbm5lbCwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsYnJnX3NldF9DVVYgKGludCBjaGFubmVsLCBpbnQgdmFsdWUpOworCitzdGF0aWMgdm9pZCBnYWxzZG1hX2VuYWJsZV9yeCAodm9pZCk7CitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X21lbV9zcGFjZSAodW5zaWduZWQgaW50IG1lbVNwYWNlLAorCQkJCSAgdW5zaWduZWQgaW50IG1lbVNwYWNlVGFyZ2V0LAorCQkJCSAgdW5zaWduZWQgaW50IG1lbVNwYWNlQXR0ciwKKwkJCQkgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKwkJCQkgIHVuc2lnbmVkIGludCBzaXplKTsKKworCisjZGVmaW5lIFNPRlRXQVJFX0NBQ0hFX01BTkFHRU1FTlQKKworI2lmZGVmIFNPRlRXQVJFX0NBQ0hFX01BTkFHRU1FTlQKKyNkZWZpbmUgRkxVU0hfRENBQ0hFKGEsYikJCSBpZihkY2FjaGVfc3RhdHVzKCkpe2NsZWFuX2RjYWNoZV9yYW5nZSgodTMyKShhKSwodTMyKShiKSk7fQorI2RlZmluZSBGTFVTSF9BTkRfSU5WQUxJREFURV9EQ0FDSEUoYSxiKSBpZihkY2FjaGVfc3RhdHVzKCkpe2ZsdXNoX2RjYWNoZV9yYW5nZSgodTMyKShhKSwodTMyKShiKSk7fQorI2RlZmluZSBJTlZBTElEQVRFX0RDQUNIRShhLGIpCQkgaWYoZGNhY2hlX3N0YXR1cygpKXtpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodTMyKShhKSwodTMyKShiKSk7fQorI2Vsc2UKKyNkZWZpbmUgRkxVU0hfRENBQ0hFKGEsYikKKyNkZWZpbmUgRkxVU0hfQU5EX0lOVkFMSURBVEVfRENBQ0hFKGEsYikKKyNkZWZpbmUgSU5WQUxJREFURV9EQ0FDSEUoYSxiKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVBTQ19ERUJVR19QT1JUCitzdGF0aWMgdm9pZCBtcHNjX2RlYnVnX2luaXQgKHZvaWQpCit7CisKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIENsZWFyIHRoZSBDRlIgIChDSFI0KSAqLworCS8qIFdyaXRlIHJhbmRvbSAnWicgYml0IChiaXQgMjkpIG9mIENIUjQgdG8gZW5hYmxlIGRlYnVnIHVhcnQgKlVORE9DVU1FTlRFRCBGRUFUVVJFKiAqLworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR180ICsgKENIQU5ORUwgKiBHQUxNUFNDX2luZGVudDogU3RhbmRhcmQgaW5wdXQ6MjI5OiBXYXJuaW5nOm9sZCBzdHlsZSBhc3NpZ25tZW50IGFtYmlndWl0eSBpbiAiPSYiLiAgQXNzdW1pbmcgIj0gJiIKKworUkVHX0dBUCkpOworCXRlbXAgJj0gMHhmZmZmZmYwMDsKKwl0ZW1wIHw9IEJJVDI5OworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzQgKyAoQ0hBTk5FTCAqIEdBTE1QU0NfUkVHX0dBUCksCisJCSAgICAgIHRlbXApOworCisJLyogU2V0IHRoZSBWYWxpZCBiaXQgJ1YnIChiaXQgMTIpIGFuZCBpbnQgZ2VuZXJhdGlvbiBiaXQgJ0lOVCcgKGJpdCAxNSkgKi8KKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfNSArIChDSEFOTkVMICogR0FMTVBTQ19SRUdfR0FQKSk7CisJdGVtcCB8PSAoQklUMTIgfCBCSVQxNSk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfNSArIChDSEFOTkVMICogR0FMTVBTQ19SRUdfR0FQKSwKKwkJICAgICAgdGVtcCk7CisKKwkvKiBTZXQgaW50IG1hc2sgKi8KKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDXzBfSU5UX01BU0spOworCXRlbXAgfD0gQklUNjsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfMF9JTlRfTUFTSywgdGVtcCk7Cit9CisjZW5kaWYKKworY2hhciBtcHNjX2dldGNoYXJfZGVidWcgKHZvaWQpCit7CisJdm9sYXRpbGUgaW50IHRlbXA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGNhdXNlOworCisJY2F1c2UgPSBHVFJFR1JFQUQgKEdBTE1QU0NfMF9JTlRfQ0FVU0UpOworCXdoaWxlICgoY2F1c2UgJiBCSVQ2KSA9PSAwKSB7CisJCWNhdXNlID0gR1RSRUdSRUFEIChHQUxNUFNDXzBfSU5UX0NBVVNFKTsKKwl9CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfMTAgKworCQkJICAoQ0hBTk5FTCAqIEdBTE1QU0NfUkVHX0dBUCkpOworCS8qIEJ5IHdyaXRpbmcgMSdzIHRvIHRoZSBzZXQgYml0cywgdGhlIHJlZ2lzdGVyIGlzIGNsZWFyZWQgKi8KKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR18xMCArIChDSEFOTkVMICogR0FMTVBTQ19SRUdfR0FQKSwKKwkJICAgICAgdGVtcCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDXzBfSU5UX0NBVVNFLCBjYXVzZSAmIH5CSVQ2KTsKKwlyZXR1cm4gKHRlbXAgPj4gMTYpICYgMHhmZjsKK30KKworLyogc3BlY2lhbCBmdW5jdGlvbiBmb3IgcnVubmluZyBvdXQgb2YgZmxhc2guICBkb2Vzbid0IG1vZGlmeSBhbnkKKyAqIGdsb2JhbCB2YXJpYWJsZXMgW2pvc2hdICovCitpbnQgbXBzY19wdXRjaGFyX2Vhcmx5IChjaGFyIGNoKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCWludCBtcHNjID0gQ0hBTk5FTDsKKwlpbnQgdGVtcCA9CisJCUdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpOworCWdhbG1wc2Nfc2V0X3Rjc2NoYXIgKG1wc2MsIGNoKTsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLAorCQkgICAgICB0ZW1wIHwgMHgyMDApOworCisjZGVmaW5lIE1BR0lDX0ZBQ1RPUgkoMTAqMTAwMDAwMCkKKworCXVkZWxheSAoTUFHSUNfRkFDVE9SIC8gZ2QtPmJhdWRyYXRlKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyB1c2VkIGFmdGVyIHJlbG9jYXRpb24sIHNlZSBzZXJpYWwuYyBhbmQgbXBzY19pbml0MiAqLworc3RhdGljIGludCBtcHNjX3B1dGNoYXJfc2RtYSAoY2hhciBjaCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnA7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKworCS8qIGFsaWduIHRoZSBkZXNjcmlwdG9yICovCisJcCA9IHR4X2Rlc2NfYmFzZTsKKwltZW1zZXQgKCh2b2lkICopIHAsIDAsIDggKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOworCisJLyogZmlsbCBvbmUgNjQgYml0IGJ1ZmZlciAqLworCS8qIHdvcmQgc3dhcCwgcGFkIHdpdGggMCAqLworCXBbNF0gPSAwOwkJLyogeCAqLworCXBbNV0gPSAodW5zaWduZWQgaW50KSBjaDsJLyogeCAqLworCisJLyogQ0hBTkdFRCBjb21wbGV0ZWx5IGFjY29yZGluZyB0byBHVDY0MjYwQSBkb3ggLSBOVEwgKi8KKwlwWzBdID0gMHgwMDAxMDAwMTsJLyogMCAqLworCXBbMV0gPSBERVNDX09XTkVSX0JJVCB8IERFU0NfRklSU1QgfCBERVNDX0xBU1Q7CS8qIDQgKi8KKwlwWzJdID0gMDsJCS8qIDggKi8KKwlwWzNdID0gKHVuc2lnbmVkIGludCkgJnBbNF07CS8qIGMgKi8KKworI2lmIDAKKwlwWzldID0gREVTQ19GSVJTVCB8IERFU0NfTEFTVDsKKwlwWzEwXSA9ICh1bnNpZ25lZCBpbnQpICZwWzBdOworCXBbMTFdID0gKHVuc2lnbmVkIGludCkgJnBbMTJdOworI2VuZGlmCisKKwlGTFVTSF9EQ0FDSEUgKCZwWzBdLCAmcFs4XSk7CisKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DVVJfVFhfUFRSICsgKENIQU5ORUwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgKHVuc2lnbmVkIGludCkgJnBbMF0pOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0ZJUl9UWF9QVFIgKyAoQ0hBTk5FTCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICAodW5zaWduZWQgaW50KSAmcFswXSk7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09NX1JFRyArIChDSEFOTkVMICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgfD0gKFRYX0RFTUFORCB8IFRYX1NUT1ApOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTV9SRUcgKyAoQ0hBTk5FTCAqIEdBTFNETUFfUkVHX0RJRkYpLCB0ZW1wKTsKKworCUlOVkFMSURBVEVfRENBQ0hFICgmcFsxXSwgJnBbMl0pOworCisJd2hpbGUgKHBbMV0gJiBERVNDX09XTkVSX0JJVCkgeworCQl1ZGVsYXkgKDEwMCk7CisJCUlOVkFMSURBVEVfRENBQ0hFICgmcFsxXSwgJnBbMl0pOworCX0KKwlyZXR1cm4gMDsKK30KKworY2hhciBtcHNjX2dldGNoYXJfc2RtYSAodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IGRvbmUgPSAwOworCXZvbGF0aWxlIGNoYXIgY2g7CisJdW5zaWduZWQgaW50IGxlbiA9IDAsIGlkeCA9IDAsIHRlbXA7CisKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnA7CisKKworCWRvIHsKKwkJcCA9ICZyeF9kZXNjX2Jhc2VbcnhfZGVzY19pbmRleCAqIDhdOworCisJCUlOVkFMSURBVEVfRENBQ0hFICgmcFswXSwgJnBbMV0pOworCQkvKiBXYWl0IGZvciBjaGFyYWN0ZXIgKi8KKwkJd2hpbGUgKHBbMV0gJiBERVNDX09XTkVSX0JJVCkgeworCQkJdWRlbGF5ICgxMDApOworCQkJSU5WQUxJREFURV9EQ0FDSEUgKCZwWzBdLCAmcFsxXSk7CisJCX0KKworCQkvKiBIYW5kbGUgZXJyb3IgY2FzZSAqLworCQlpZiAocFsxXSAmICgxIDw8IDE1KSkgeworCQkJcHJpbnRmICgib29wcywgZXJyb3I6ICUwOHhcbiIsIHBbMV0pOworCisJCQl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArCisJCQkJCSAgKENIQU5ORUwgKiBHQUxNUFNDX1JFR19HQVApKTsKKwkJCXRlbXAgfD0gKDEgPDwgMjMpOworCQkJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArCisJCQkJICAgICAgKENIQU5ORUwgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCQkJLyogQ2FuJ3QgcG9sbCBvbiBhYm9ydCBiaXQsIHNvIHdlIGp1c3Qgd2FpdC4gKi8KKwkJCXVkZWxheSAoMTAwKTsKKworCQkJZ2Fsc2RtYV9lbmFibGVfcnggKCk7CisJCX0KKworCQkvKiBOdW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiB0aGlzIGRlc2NyaXB0b3IgKi8KKwkJbGVuID0gcFswXSAmIDB4ZmZmZjsKKworCQlpZiAobGVuKSB7CisJCQkvKiBXaGVyZSB0byBsb29rICovCisJCQlpZHggPSA1OworCQkJaWYgKGRvbmUgPiAzKQorCQkJCWlkeCA9IDQ7CisJCQlpZiAoZG9uZSA+IDcpCisJCQkJaWR4ID0gNzsKKwkJCWlmIChkb25lID4gMTEpCisJCQkJaWR4ID0gNjsKKworCQkJSU5WQUxJREFURV9EQ0FDSEUgKCZwW2lkeF0sICZwW2lkeCArIDFdKTsKKwkJCWNoID0gcFtpZHhdICYgMHhmZjsKKwkJCWRvbmUrKzsKKwkJfQorCisJCWlmIChkb25lIDwgbGVuKSB7CisJCQkvKiB0aGlzIGRlc2NyaXB0b3IgaGFzIG1vcmUgYnl0ZXMgc3RpbGwKKwkJCSAqIHNoaWZ0IGRvd24gdGhlIGNoYXIgd2UganVzdCByZWFkLCBhbmQgbGVhdmUgdGhlCisJCQkgKiBidWZmZXIgaW4gcGxhY2UgZm9yIHRoZSBuZXh0IHRpbWUgYXJvdW5kCisJCQkgKi8KKwkJCXBbaWR4XSA9IHBbaWR4XSA+PiA4OworCQkJRkxVU0hfRENBQ0hFICgmcFtpZHhdLCAmcFtpZHggKyAxXSk7CisJCX0KKworCQlpZiAoZG9uZSA9PSBsZW4pIHsKKwkJCS8qIG5vdGhpbmcgbGVmdCBpbiB0aGlzIGRlc2NyaXB0b3IuCisJCQkgKiBnbyB0byBuZXh0IG9uZQorCQkJICovCisJCQlwWzFdID0gREVTQ19PV05FUl9CSVQgfCBERVNDX0ZJUlNUIHwgREVTQ19MQVNUOworCQkJcFswXSA9IDB4MDAxMDAwMDA7CisJCQlGTFVTSF9EQ0FDSEUgKCZwWzBdLCAmcFsxXSk7CisJCQkvKiBOZXh0IGRlc2NyaXB0b3IgKi8KKwkJCXJ4X2Rlc2NfaW5kZXggPSAocnhfZGVzY19pbmRleCArIDEpICUgUlhfREVTQzsKKwkJCWRvbmUgPSAwOworCQl9CisJfSB3aGlsZSAobGVuID09IDApOwkvKiBnYWxpbGVvIGJ1Zy4uIGxlbiBtaWdodCBiZSB6ZXJvICovCisKKwlyZXR1cm4gY2g7Cit9CisKKworaW50IG1wc2NfdGVzdF9jaGFyX2RlYnVnICh2b2lkKQoreworCWlmICgoR1RSRUdSRUFEIChHQUxNUFNDXzBfSU5UX0NBVVNFKSAmIEJJVDYpID09IDApCisJCXJldHVybiAwOworCWVsc2UgeworCQlyZXR1cm4gMTsKKwl9Cit9CisKKworaW50IG1wc2NfdGVzdF9jaGFyX3NkbWEgKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpwID0gJnJ4X2Rlc2NfYmFzZVtyeF9kZXNjX2luZGV4ICogOF07CisKKwlJTlZBTElEQVRFX0RDQUNIRSAoJnBbMV0sICZwWzJdKTsKKworCWlmIChwWzFdICYgREVTQ19PV05FUl9CSVQpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK2ludCBtcHNjX2luaXQgKGludCBiYXVkKQoreworCS8qIEJSRyBDT05GSUcgKi8KKwlnYWxicmdfc2V0X2JhdWRyYXRlIChDSEFOTkVMLCBiYXVkKTsKKwlnYWxicmdfc2V0X2Nsa3NyYyAoQ0hBTk5FTCwgOCk7CS8qIHNldCBzb3VyY2U9VGNsayAqLworCWdhbGJyZ19zZXRfQ1VWIChDSEFOTkVMLCAwKTsJLyogc2V0IHVwIENvdW50VXBWYWx1ZSAqLworCWdhbGJyZ19lbmFibGUgKENIQU5ORUwpOwkvKiBFbmFibGUgQlJHICovCisKKwkvKiBTZXQgdXAgY2xvY2sgcm91dGluZyAqLworCWdhbG1wc2NfY29ubmVjdCAoQ0hBTk5FTCwgR0FMTVBTQ19DT05ORUNUKTsJLyogY29ubmVjdCBpdCAqLworCisJZ2FsbXBzY19yb3V0ZV9yeF9jbG9jayAoQ0hBTk5FTCwgQ0hBTk5FTCk7CS8qIGNob3NzZSBCUkcwIGZvciBSeCAqLworCWdhbG1wc2Nfcm91dGVfdHhfY2xvY2sgKENIQU5ORUwsIENIQU5ORUwpOwkvKiBjaG9zZSBCUkcwIGZvciBUeCAqLworCisJLyogcmVzZXQgTVBTQyBzdGF0ZSAqLworCWdhbG1wc2Nfc2h1dGRvd24gKENIQU5ORUwpOworCisJLyogU0RNQSBDT05GSUcgKi8KKwlnYWxzZG1hX3NldF9idXJzdHNpemUgKENIQU5ORUwsIEwxX0NBQ0hFX0JZVEVTIC8gOCk7CS8qIGluIDY0IGJpdCB3b3JkcyAoOCBieXRlcykgKi8KKwlnYWxzZG1hX3NldF90eGxlIChDSEFOTkVMKTsKKwlnYWxzZG1hX3NldF9yeGxlIChDSEFOTkVMKTsKKwlnYWxzZG1hX3NldF9SQyAoQ0hBTk5FTCwgMHhmKTsKKwlnYWxzZG1hX3NldF9TRk0gKENIQU5ORUwpOworCWdhbHNkbWFfc2V0X1JGVCAoQ0hBTk5FTCk7CisKKwkvKiBNUFNDIENPTkZJRyAqLworCWdhbG1wc2Nfd3JpdGVfY29uZmlnX3JlZ3MgKENIQU5ORUwsIEdBTE1QU0NfVUFSVCk7CisJZ2FsbXBzY19jb25maWdfY2hhbm5lbF9yZWdzIChDSEFOTkVMKTsKKwlnYWxtcHNjX3NldF9jaGFyX2xlbmd0aCAoQ0hBTk5FTCwgR0FMTVBTQ19DSEFSX0xFTkdUSF84KTsJLyogOCAqLworCWdhbG1wc2Nfc2V0X3Bhcml0eSAoQ0hBTk5FTCwgR0FMTVBTQ19QQVJJVFlfTk9ORSk7CS8qIE4gKi8KKwlnYWxtcHNjX3NldF9zdG9wX2JpdF9sZW5ndGggKENIQU5ORUwsIEdBTE1QU0NfU1RPUF9CSVRTXzEpOwkvKiAxICovCisKKyNpZmRlZiBDT05GSUdfTVBTQ19ERUJVR19QT1JUCisJbXBzY19kZWJ1Z19pbml0ICgpOworI2VuZGlmCisKKwkvKiBDT01NX01QU0MgQ09ORklHICovCisjaWZkZWYgU09GVFdBUkVfQ0FDSEVfTUFOQUdFTUVOVAorCWdhbG1wc2Nfc2V0X3Nub29wIChDSEFOTkVMLCAwKTsJLyogZGlzYWJsZSBzbm9vcCAqLworI2Vsc2UKKwlnYWxtcHNjX3NldF9zbm9vcCAoQ0hBTk5FTCwgMSk7CS8qIGVuYWJsZSBzbm9vcCAqLworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIG1wc2Nfc2RtYV9pbml0ICh2b2lkKQoreworLyogU2V0dXAgU0RNQSBjaGFubmVsMCBTRE1BX0NPTkZJR19SRUcqLworCUdUX1JFR19XUklURSAoU0RNQV9DT05GSUdfUkVHICgwKSwgMHgwMDAwMjBmZik7CisKKy8qICBFbmFibGUgTVBTQy1XaW5kb3cwIGZvciBEUkFNIEJhbmswICAgKi8KKwlpZiAoZ2Fsc2RtYV9zZXRfbWVtX3NwYWNlIChNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9XSU5fMF9CSVQsCisJCQkJICAgTVY2NDM2MF9TRE1BX0RSQU1fQ1NfMF9UQVJHRVQsCisJCQkJICAgMCwKKwkJCQkgICBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MKKwkJCQkgICAoQ1NfMF9MT1dfREVDT0RFX0FERFJFU1MpLAorCQkJCSAgIG1lbW9yeUdldEJhbmtTaXplIChCQU5LMCkpICE9IHRydWUpCisJCXByaW50ZiAoIiVzOiBTRE1BX1dpbmRvdzAgbWVtb3J5IHNldHVwIGZhaWxlZCAhISEgXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCisvKiAgRGlzYWJsZSBNUFNDLVdpbmRvdzEgICAgKi8KKwlpZiAoZ2Fsc2RtYV9zZXRfbWVtX3NwYWNlIChNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9XSU5fMV9CSVQsCisJCQkJICAgTVY2NDM2MF9TRE1BX0RSQU1fQ1NfMF9UQVJHRVQsCisJCQkJICAgMCwKKwkJCQkgICBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MKKwkJCQkgICAoQ1NfMV9MT1dfREVDT0RFX0FERFJFU1MpLAorCQkJCSAgIG1lbW9yeUdldEJhbmtTaXplIChCQU5LMykpICE9IHRydWUpCisJCXByaW50ZiAoIiVzOiBTRE1BX1dpbmRvdzEgbWVtb3J5IHNldHVwIGZhaWxlZCAhISEgXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCisvKiAgRGlzYWJsZSBNUFNDLVdpbmRvdzIgKi8KKwlpZiAoZ2Fsc2RtYV9zZXRfbWVtX3NwYWNlIChNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9XSU5fMl9CSVQsCisJCQkJICAgTVY2NDM2MF9TRE1BX0RSQU1fQ1NfMF9UQVJHRVQsCisJCQkJICAgMCwKKwkJCQkgICBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MKKwkJCQkgICAoQ1NfMl9MT1dfREVDT0RFX0FERFJFU1MpLAorCQkJCSAgIG1lbW9yeUdldEJhbmtTaXplIChCQU5LMykpICE9IHRydWUpCisJCXByaW50ZiAoIiVzOiBTRE1BX1dpbmRvdzIgbWVtb3J5IHNldHVwIGZhaWxlZCAhISEgXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworCisvKiAgRGlzYWJsZSBNUFNDLVdpbmRvdzMgKi8KKwlpZiAoZ2Fsc2RtYV9zZXRfbWVtX3NwYWNlIChNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9XSU5fM19CSVQsCisJCQkJICAgTVY2NDM2MF9TRE1BX0RSQU1fQ1NfMF9UQVJHRVQsCisJCQkJICAgMCwKKwkJCQkgICBtZW1vcnlHZXRCYW5rQmFzZUFkZHJlc3MKKwkJCQkgICAoQ1NfM19MT1dfREVDT0RFX0FERFJFU1MpLAorCQkJCSAgIG1lbW9yeUdldEJhbmtTaXplIChCQU5LMykpICE9IHRydWUpCisJCXByaW50ZiAoIiVzOiBTRE1BX1dpbmRvdzMgbWVtb3J5IHNldHVwIGZhaWxlZCAhISEgXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKworLyogIFNldHVwIE1QU0MwIGFjY2VzcyBtb2RlIFdpbmRvdzAgZnVsbCBhY2Nlc3MgKi8KKwlHVF9TRVRfUkVHX0JJVFMgKE1QU0MwX0FDQ0VTU19QUk9URUNUSU9OX1JFRywKKwkJCSAoTVY2NDM2MF9TRE1BX1dJTl9BQ0NFU1NfRlVMTCA8PAorCQkJICAoTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzBfQklUICogMikpKTsKKworLyogIFNldHVwIE1QU0MxIGFjY2VzcyBtb2RlIFdpbmRvdzEgZnVsbCBhY2Nlc3MgKi8KKwlHVF9TRVRfUkVHX0JJVFMgKE1QU0MxX0FDQ0VTU19QUk9URUNUSU9OX1JFRywKKwkJCSAoTVY2NDM2MF9TRE1BX1dJTl9BQ0NFU1NfRlVMTCA8PAorCQkJICAoTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzBfQklUICogMikpKTsKKworLyogU2V0dXAgTVBTQyBpbnRlcm5hbCBhZGRyZXNzIHNwYWNlIGJhc2UgYWRkcmVzcyAJKi8KKwlHVF9SRUdfV1JJVEUgKENVTklUX0lOVEVSTkFMX1NQQUNFX0JBU0VfQUREUl9SRUcsIENGR19HVF9SRUdTKTsKKworLyogbm8gaGlnaCBhZGRyZXNzIHJlbWFwKi8KKwlHVF9SRUdfV1JJVEUgKENVTklUX0hJR0hfQUREUl9SRU1BUF9SRUcwLCAweDAwKTsKKwlHVF9SRUdfV1JJVEUgKENVTklUX0hJR0hfQUREUl9SRU1BUF9SRUcxLCAweDAwKTsKKworLyogY2xlYXIgaW50ZXJydXB0IGNhdXNlIHJlZ2lzdGVyIGZvciBNUFNDIChmYXVsdCByZWdpc3RlcikqLworCUdUX1JFR19XUklURSAoQ1VOSVRfSU5URVJSVVBUX0NBVVNFX1JFRywgMHgwMCk7Cit9CisKKwordm9pZCBtcHNjX2luaXQyICh2b2lkKQoreworCWludCBpOworCisjaWZuZGVmIENPTkZJR19NUFNDX0RFQlVHX1BPUlQKKwltcHNjX3B1dGNoYXIgPSBtcHNjX3B1dGNoYXJfc2RtYTsKKwltcHNjX2dldGNoYXIgPSBtcHNjX2dldGNoYXJfc2RtYTsKKwltcHNjX3Rlc3RfY2hhciA9IG1wc2NfdGVzdF9jaGFyX3NkbWE7CisjZW5kaWYKKwkvKiBSWCBkZXNjcmlwdG9ycyAqLworCXJ4X2Rlc2NfYmFzZSA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jICgoKFJYX0RFU0MgKyAxKSAqIDgpICoKKwkJCQkJCXNpemVvZiAodW5zaWduZWQgaW50KSk7CisKKwkvKiBhbGlnbiBkZXNjcmlwdG9ycyAqLworCXJ4X2Rlc2NfYmFzZSA9ICh1bnNpZ25lZCBpbnQgKikKKwkJKCgodW5zaWduZWQgaW50KSByeF9kZXNjX2Jhc2UgKyAzMikgJiAweEZGRkZGRkYwKTsKKworCXJ4X2Rlc2NfaW5kZXggPSAwOworCisJbWVtc2V0ICgodm9pZCAqKSByeF9kZXNjX2Jhc2UsIDAsCisJCShSWF9ERVNDICogOCkgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOworCisJZm9yIChpID0gMDsgaSA8IFJYX0RFU0M7IGkrKykgeworCQlyeF9kZXNjX2Jhc2VbaSAqIDggKyAzXSA9ICh1bnNpZ25lZCBpbnQpICZyeF9kZXNjX2Jhc2VbaSAqIDggKyA0XTsJLyogQnVmZmVyICovCisJCXJ4X2Rlc2NfYmFzZVtpICogOCArIDJdID0gKHVuc2lnbmVkIGludCkgJnJ4X2Rlc2NfYmFzZVsoaSArIDEpICogOF07CS8qIE5leHQgZGVzY3JpcHRvciAqLworCQlyeF9kZXNjX2Jhc2VbaSAqIDggKyAxXSA9IERFU0NfT1dORVJfQklUIHwgREVTQ19GSVJTVCB8IERFU0NfTEFTVDsJLyogQ29tbWFuZCAmIGNvbnRyb2wgKi8KKwkJcnhfZGVzY19iYXNlW2kgKiA4XSA9IDB4MDAxMDAwMDA7CisJfQorCXJ4X2Rlc2NfYmFzZVsoaSAtIDEpICogOCArIDJdID0gKHVuc2lnbmVkIGludCkgJnJ4X2Rlc2NfYmFzZVswXTsKKworCUZMVVNIX0RDQUNIRSAoJnJ4X2Rlc2NfYmFzZVswXSwgJnJ4X2Rlc2NfYmFzZVtSWF9ERVNDICogOF0pOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NVUl9SWF9QVFIgKyAoQ0hBTk5FTCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICAodW5zaWduZWQgaW50KSAmcnhfZGVzY19iYXNlWzBdKTsKKworCS8qIFRYIGRlc2NyaXB0b3JzICovCisJdHhfZGVzY19iYXNlID0gKHVuc2lnbmVkIGludCAqKSBtYWxsb2MgKCgoVFhfREVTQyArIDEpICogOCkgKgorCQkJCQkJc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKworCS8qIGFsaWduIGRlc2NyaXB0b3JzICovCisJdHhfZGVzY19iYXNlID0gKHVuc2lnbmVkIGludCAqKQorCQkoKCh1bnNpZ25lZCBpbnQpIHR4X2Rlc2NfYmFzZSArIDMyKSAmIDB4RkZGRkZGRjApOworCisJdHhfZGVzY19pbmRleCA9IC0xOworCisJbWVtc2V0ICgodm9pZCAqKSB0eF9kZXNjX2Jhc2UsIDAsCisJCShUWF9ERVNDICogOCkgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpOworCisJZm9yIChpID0gMDsgaSA8IFRYX0RFU0M7IGkrKykgeworCQl0eF9kZXNjX2Jhc2VbaSAqIDggKyA1XSA9ICh1bnNpZ25lZCBpbnQpIDB4MjMyMzIzMjM7CisJCXR4X2Rlc2NfYmFzZVtpICogOCArIDRdID0gKHVuc2lnbmVkIGludCkgMHgyMzIzMjMyMzsKKwkJdHhfZGVzY19iYXNlW2kgKiA4ICsgM10gPQorCQkJKHVuc2lnbmVkIGludCkgJnR4X2Rlc2NfYmFzZVtpICogOCArIDRdOworCQl0eF9kZXNjX2Jhc2VbaSAqIDggKyAyXSA9CisJCQkodW5zaWduZWQgaW50KSAmdHhfZGVzY19iYXNlWyhpICsgMSkgKiA4XTsKKwkJdHhfZGVzY19iYXNlW2kgKiA4ICsgMV0gPQorCQkJREVTQ19PV05FUl9CSVQgfCBERVNDX0ZJUlNUIHwgREVTQ19MQVNUOworCisJCS8qIHNldCBzYnl0ZWNudCBhbmQgc2hhZG93IGJ5dGUgY250IHRvIDEgKi8KKwkJdHhfZGVzY19iYXNlW2kgKiA4XSA9IDB4MDAwMTAwMDE7CisJfQorCXR4X2Rlc2NfYmFzZVsoaSAtIDEpICogOCArIDJdID0gKHVuc2lnbmVkIGludCkgJnR4X2Rlc2NfYmFzZVswXTsKKworCUZMVVNIX0RDQUNIRSAoJnR4X2Rlc2NfYmFzZVswXSwgJnR4X2Rlc2NfYmFzZVtUWF9ERVNDICogOF0pOworCisJdWRlbGF5ICgxMDApOworCisJZ2Fsc2RtYV9lbmFibGVfcnggKCk7CisKKwlyZXR1cm47Cit9CisKK2ludCBnYWxicmdfc2V0X2JhdWRyYXRlIChpbnQgY2hhbm5lbCwgaW50IHJhdGUpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisJaW50IGNsb2NrOworCisJZ2FsYnJnX2Rpc2FibGUgKGNoYW5uZWwpOwkvKm9rICovCisKKyNpZmRlZiBaVU1BX05UTAorCS8qIGZyb20gdGNsayAqLworCWNsb2NrID0gKENGR19UQ0xLIC8gKDE2ICogcmF0ZSkpIC0gMTsKKyNlbHNlCisJY2xvY2sgPSAoQ0ZHX1RDTEsgLyAoMTYgKiByYXRlKSkgLSAxOworI2VuZGlmCisKKwlnYWxicmdfc2V0X0NEViAoY2hhbm5lbCwgY2xvY2spOwkvKiBzZXQgdGltZXIgUmVnLiBmb3IgQlJHICovCisKKwlnYWxicmdfZW5hYmxlIChjaGFubmVsKTsKKworCWdkLT5iYXVkcmF0ZSA9IHJhdGU7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEJlbG93IGFyZSBhbGwgdGhlIHByaXZhdGUgZnVuY3Rpb25zIHRoYXQgbm8gb25lIGVsc2UgbmVlZHMgKi8KKworc3RhdGljIGludCBnYWxicmdfc2V0X0NEViAoaW50IGNoYW5uZWwsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSk7CisJdGVtcCAmPSAweEZGRkYwMDAwOworCXRlbXAgfD0gKHZhbHVlICYgMHgwMDAwRkZGRik7CisJR1RfUkVHX1dSSVRFIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsYnJnX2VuYWJsZSAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCkpOworCXRlbXAgfD0gMHgwMDAxMDAwMDsKKwlHVF9SRUdfV1JJVEUgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxicmdfZGlzYWJsZSAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCkpOworCXRlbXAgJj0gMHhGRkZFRkZGRjsKKwlHVF9SRUdfV1JJVEUgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxicmdfc2V0X2Nsa3NyYyAoaW50IGNoYW5uZWwsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSk7CisJdGVtcCAmPSAweEZGQzNGRkZGOwkvKiBCaXQgMTggLSAyMSAoTVYgNjQyNjAgMTgtMjIpICovCisJdGVtcCB8PSAodmFsdWUgPDwgMTgpOworCUdUX1JFR19XUklURSAoR0FMQlJHXzBfQ09ORlJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApLCB0ZW1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxicmdfc2V0X0NVViAoaW50IGNoYW5uZWwsIGludCB2YWx1ZSkKK3sKKwkvKiBzZXQgQ291bnRVcFZhbHVlICovCisJR1RfUkVHX1dSSVRFIChHQUxCUkdfMF9CVFJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZ2FsYnJnX3Jlc2V0IChpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSk7CisJdGVtcCB8PSAweDIwMDAwOworCUdUX1JFR19XUklURSAoR0FMQlJHXzBfQ09ORlJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfUkZUIChpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgfD0gMHgwMDAwMDAwMTsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRiksCisJCSAgICAgIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfU0ZNIChpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgfD0gMHgwMDAwMDAwMjsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRiksCisJCSAgICAgIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfcnhsZSAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wIHw9IDB4MDAwMDAwNDA7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X3R4bGUgKGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMU0RNQV8wX0NPTkZfUkVHICsgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSk7CisJdGVtcCB8PSAweDAwMDAwMDgwOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHICsgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxzZG1hX3NldF9SQyAoaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgJj0gfjB4MDAwMDAwM2M7CisJdGVtcCB8PSAodmFsdWUgPDwgMik7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X2J1cnN0c2l6ZSAoaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgJj0gMHhGRkZGQ0ZGRjsKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSA4OgorCQlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArCisJCQkgICAgICAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkJICAgICAgKHRlbXAgfCAoMHgzIDw8IDEyKSkpOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKworCQkJICAgICAgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJCSAgICAgICh0ZW1wIHwgKDB4MiA8PCAxMikpKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHICsKKwkJCSAgICAgIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRiksCisJCQkgICAgICAodGVtcCB8ICgweDEgPDwgMTIpKSk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArCisJCQkgICAgICAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkJICAgICAgKHRlbXAgfCAoMHgwIDw8IDEyKSkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19jb25uZWN0IChpbnQgY2hhbm5lbCwgaW50IGNvbm5lY3QpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX1JPVVRJTkdfUkVHSVNURVIpOworCisJaWYgKChjaGFubmVsID09IDApICYmIGNvbm5lY3QpCisJCXRlbXAgJj0gfjB4MDAwMDAwMDc7CisJZWxzZSBpZiAoKGNoYW5uZWwgPT0gMSkgJiYgY29ubmVjdCkKKwkJdGVtcCAmPSB+KDB4MDAwMDAwMDcgPDwgNik7CisJZWxzZSBpZiAoKGNoYW5uZWwgPT0gMCkgJiYgIWNvbm5lY3QpCisJCXRlbXAgfD0gMHgwMDAwMDAwNzsKKwllbHNlCisJCXRlbXAgfD0gKDB4MDAwMDAwMDcgPDwgNik7CisKKwkvKiBKdXN0IGluIGNhc2UuLi4gKi8KKwl0ZW1wICY9IDB4M2ZmZmZmZmY7CisKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfUk9VVElOR19SRUdJU1RFUiwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxtcHNjX3JvdXRlX3J4X2Nsb2NrIChpbnQgY2hhbm5lbCwgaW50IGJyZykKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfUnhDX1JPVVRFKTsKKworCWlmIChjaGFubmVsID09IDApIHsKKwkJdGVtcCAmPSB+MHgwMDAwMDAwRjsKKwkJdGVtcCB8PSBicmc7CisJfSBlbHNlIHsKKwkJdGVtcCAmPSB+MHgwMDAwMEYwMDsKKwkJdGVtcCB8PSAoYnJnIDw8IDgpOworCX0KKworCUdUX1JFR19XUklURSAoR0FMTVBTQ19SeENfUk9VVEUsIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19yb3V0ZV90eF9jbG9jayAoaW50IGNoYW5uZWwsIGludCBicmcpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX1R4Q19ST1VURSk7CisKKwlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCXRlbXAgJj0gfjB4MDAwMDAwMEY7CisJCXRlbXAgfD0gYnJnOworCX0gZWxzZSB7CisJCXRlbXAgJj0gfjB4MDAwMDBGMDA7CisJCXRlbXAgfD0gKGJyZyA8PCA4KTsKKwl9CisKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfVHhDX1JPVVRFLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfd3JpdGVfY29uZmlnX3JlZ3MgKGludCBtcHNjLCBpbnQgbW9kZSkKK3sKKwlpZiAobW9kZSA9PSBHQUxNUFNDX1VBUlQpIHsKKwkJLyogTWFpbiBjb25maWcgcmVnIExvdyAoTnVsbCBtb2RlbSwgRW5hYmxlIFR4L1J4LCBVQVJUIG1vZGUpICovCisJCUdUX1JFR19XUklURSAoR0FMTVBTQ19NQ09ORl9MT1cgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksCisJCQkgICAgICAweDAwMDAwNGM0KTsKKworCQkvKiBNYWluIGNvbmZpZyByZWcgSGlnaCAoMzJ4IFJ4L1R4IGNsb2NrIG1vZGUsIHdpZHRoPThiaXRzICovCisJCUdUX1JFR19XUklURSAoR0FMTVBTQ19NQ09ORl9ISUdIICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLAorCQkJICAgICAgMHgwMjQwMDNmOCk7CisJCS8qICAgICAgICAyMiAyMjIyIDExMTEgKi8KKwkJLyogICAgICAgIDU0IDMyMTAgOTg3NiAqLworCQkvKiAwMDAwIDAwMTAgMDAwMCAwMDAwICovCisJCS8qICAgICAgIDEgKi8KKwkJLyogICAgICAgMDk4IDc2NTQgMzIxMCAqLworCQkvKiAwMDAwIDAwMTEgMTExMSAxMDAwICovCisJfSBlbHNlCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2NfY29uZmlnX2NoYW5uZWxfcmVncyAoaW50IG1wc2MpCit7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMSArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMyArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMSk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfNCArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfNSArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfNiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfNyArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfOCArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfOSArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMTAgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCisJZ2FsbXBzY19zZXRfYnJrY250IChtcHNjLCAweDMpOworCWdhbG1wc2Nfc2V0X3Rjc2NoYXIgKG1wc2MsIDB4YWIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfYnJrY250IChpbnQgbXBzYywgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzEgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpOworCXRlbXAgJj0gMHgwMDAwRkZGRjsKKwl0ZW1wIHw9ICh2YWx1ZSA8PCAxNik7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMSArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxtcHNjX3NldF90Y3NjaGFyIChpbnQgbXBzYywgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzEgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpOworCXRlbXAgJj0gMHhGRkZGMDAwMDsKKwl0ZW1wIHw9IHZhbHVlOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzEgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfY2hhcl9sZW5ndGggKGludCBtcHNjLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX1BST1RPQ09ORl9SRUcgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpOworCXRlbXAgJj0gMHhGRkZGQ0ZGRjsKKwl0ZW1wIHw9ICh2YWx1ZSA8PCAxMik7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX1BST1RPQ09ORl9SRUcgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfc3RvcF9iaXRfbGVuZ3RoIChpbnQgbXBzYywgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19QUk9UT0NPTkZfUkVHICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wICY9IDB4RkZGRkJGRkY7CisJdGVtcCB8PSAodmFsdWUgPDwgMTQpOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19QUk9UT0NPTkZfUkVHICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X3Bhcml0eSAoaW50IG1wc2MsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwlpZiAodmFsdWUgIT0gLTEpIHsKKwkJdGVtcCAmPSAweEZGRjNGRkYzOworCQl0ZW1wIHw9ICgodmFsdWUgPDwgMTgpIHwgKHZhbHVlIDw8IDIpKTsKKwkJdGVtcCB8PSAoKHZhbHVlIDw8IDE3KSB8ICh2YWx1ZSA8PCAxKSk7CisJfSBlbHNlIHsKKwkJdGVtcCAmPSAweEZGRjFGRkYxOworCX0KKworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19lbnRlcl9odW50IChpbnQgbXBzYykKK3sKKwlpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wIHw9IDB4ODAwMDAwMDA7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgdGVtcCk7CisKKwl3aGlsZSAoR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSkgJgorCSAgICAgICBNUFNDX0VOVEVSX0hVTlQpIHsKKwkJdWRlbGF5ICgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnYWxtcHNjX3NodXRkb3duIChpbnQgbXBzYykKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIGNhdXNlIFJYIGFib3J0IChjbGVhcnMgUlgpICovCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpOworCXRlbXAgfD0gTVBTQ19SWF9BQk9SVCB8IE1QU0NfVFhfQUJPUlQ7CisJdGVtcCAmPSB+TVBTQ19FTlRFUl9IVU5UOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09NX1JFRywgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09NX1JFRywgU0RNQV9UWF9BQk9SVCB8IFNETUFfUlhfQUJPUlQpOworCisJLyogc2h1dCBkb3duIHRoZSBNUFNDICovCisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX01DT05GX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX01DT05GX0hJR0gsIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19QUk9UT0NPTkZfUkVHICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCAwKTsKKworCXVkZWxheSAoMTAwKTsKKworCS8qIHNodXQgZG93biB0aGUgc2RtYSBlbmdpbmVzLiAqLworCS8qIHJlc2V0IGNvbmZpZyB0byBkZWZhdWx0ICovCisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcsIDB4MDAwMDAwZmMpOworCisJdWRlbGF5ICgxMDApOworCisJLyogY2xlYXIgdGhlIFNETUEgY3VycmVudCBhbmQgZmlyc3QgVFggYW5kIFJYIHBvaW50ZXJzICovCisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ1VSX1JYX1BUUiwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ1VSX1RYX1BUUiwgMCk7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfRklSX1RYX1BUUiwgMCk7CisKKwl1ZGVsYXkgKDEwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2Fsc2RtYV9lbmFibGVfcnggKHZvaWQpCit7CisJaW50IHRlbXA7CisKKwkvKiBFbmFibGUgUlggcHJvY2Vzc2luZyAqLworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT01fUkVHICsgKENIQU5ORUwgKiBHQUxTRE1BX1JFR19ESUZGKSk7CisJdGVtcCB8PSBSWF9FTkFCTEU7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09NX1JFRyArIChDSEFOTkVMICogR0FMU0RNQV9SRUdfRElGRiksIHRlbXApOworCisJZ2FsbXBzY19lbnRlcl9odW50IChDSEFOTkVMKTsKK30KKworc3RhdGljIGludCBnYWxtcHNjX3NldF9zbm9vcCAoaW50IG1wc2MsIGludCB2YWx1ZSkKK3sKKwlpbnQgcmVnID0KKwkJbXBzYyA/IE1QU0NfMV9BRERSRVNTX0NPTlRST0xfTE9XIDoKKwkJTVBTQ18wX0FERFJFU1NfQ09OVFJPTF9MT1c7CisJaW50IHRlbXAgPSBHVFJFR1JFQUQgKHJlZyk7CisKKwlpZiAodmFsdWUpCisJCXRlbXAgfD0gKDEgPDwgNikgfCAoMSA8PCAxNCkgfCAoMSA8PCAyMikgfCAoMSA8PCAzMCk7CisJZWxzZQorCQl0ZW1wICY9IH4oKDEgPDwgNikgfCAoMSA8PCAxNCkgfCAoMSA8PCAyMikgfCAoMSA8PCAzMCkpOworCUdUX1JFR19XUklURSAocmVnLCB0ZW1wKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZ2Fsc2RtYV9zZXRfbWVtX3NwYWNlIC0gU2V0IE1WNjQzNjAgSURNQSBtZW1vcnkgZGVjb2RpbmcgbWFwLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgdGhlIE1WNjQzNjAgU0RNQSBoYXMgaXRzIG93biBhZGRyZXNzIGRlY29kaW5nIG1hcCB0aGF0IGlzIGRlLWNvdXBsZWQKKyogICAgICAgZnJvbSB0aGUgQ1BVIGludGVyZmFjZSBhZGRyZXNzIGRlY29kaW5nIHdpbmRvd3MuIFRoZSBTRE1BIGNoYW5uZWxzCisqICAgICAgIHNoYXJlIGZvdXIgYWRkcmVzcyB3aW5kb3dzLiBFYWNoIHJlZ2lvbiBjYW4gYmUgaW5kaXZpZHVhbGx5IGNvbmZpZ3VyZWQKKyogICAgICAgYnkgdGhpcyBmdW5jdGlvbiBieSBhc3NvY2lhdGluZyBpdCB0byBhIHRhcmdldCBpbnRlcmZhY2UgYW5kIHNldHRpbmcKKyogICAgICAgYmFzZSBhbmQgc2l6ZSB2YWx1ZXMuCisqCisqICAgICAgTk9URSEhIQorKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGluIDY0S2J5dGUgZ3JhbnVsYXJpdHkuCisqICAgICAgIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzaXplLgorKiAgICAgICBUaGUgc2l6ZSBtdXN0IGJlIGEgc2VyaWVzIG9mIDFzIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIHplcm9zCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBUcnVlIGZvciBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X21lbV9zcGFjZSAodW5zaWduZWQgaW50IG1lbVNwYWNlLAorCQkJCSAgdW5zaWduZWQgaW50IG1lbVNwYWNlVGFyZ2V0LAorCQkJCSAgdW5zaWduZWQgaW50IG1lbVNwYWNlQXR0ciwKKwkJCQkgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCUdUX1JFU0VUX1JFR19CSVRTIChNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9FTkFCTEVfUkVHLAorCQkJCSAgIDEgPDwgbWVtU3BhY2UpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4gICovCisJaWYgKGJhc2VBZGRyZXNzICUgc2l6ZSAhPSAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHNpemUgPCAweDEwMDAwKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBBbGlnbiBzaXplIGFuZCBiYXNlIHRvIDY0SyAqLworCWJhc2VBZGRyZXNzICY9IDB4ZmZmZjAwMDA7CisJc2l6ZSAmPSAweGZmZmYwMDAwOworCXRlbXAgPSBzaXplID4+IDE2OworCisJLyogQ2hlY2tpbmcgdGhhdCB0aGUgc2l6ZSBpcyBhIHNlcXVlbmNlIG9mICcxJyBmb2xsb3dlZCBieSBhCisJICAgc2VxdWVuY2Ugb2YgJzAnIHN0YXJ0aW5nIGZyb20gTFNCIHRvIE1TQi4gKi8KKwl3aGlsZSAoKHRlbXAgPiAwKSAmJiAodGVtcCAmIDB4MSkpIHsKKwkJdGVtcCA9IHRlbXAgPj4gMTsKKwl9CisKKwlpZiAodGVtcCAhPSAwKSB7CisJCUdUX1JFR19XUklURSAoTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfUkVHMCArIG1lbVNwYWNlICogOCwKKwkJCSAgICAgIChiYXNlQWRkcmVzcyB8IG1lbVNwYWNlVGFyZ2V0IHwgbWVtU3BhY2VBdHRyKSk7CisJCUdUX1JFR19XUklURSAoKE1WNjQzNjBfQ1VOSVRfU0laRTAgKyBtZW1TcGFjZSAqIDgpLAorCQkJICAgICAgKHNpemUgLSAxKSAmIDB4ZmZmZjAwMDApOworCQlHVF9SRVNFVF9SRUdfQklUUyAoTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfRU5BQkxFX1JFRywKKwkJCQkgICAxIDw8IG1lbVNwYWNlKTsKKwl9IGVsc2UgeworCQkvKiBBbiBpbnZhbGlkIHNpemUgd2FzIHNwZWNpZmllZCAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL21wc2MuaCBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9tcHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1ZjhjMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9tcHNjLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvaG4gQ2xlbWVucyA8Y2xlbWVuc0BtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2hhbmdlcyBmb3IgTWFydmVsbCBEQjY0MzYwIGV2YWwgYm9hcmQgMjAwMyBieSBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIG1wc2MuaCAtIGhlYWRlciBmaWxlIGZvciBNUFNDIGluIHVhcnQgbW9kZSAoY29uc29sZSBkcml2ZXIpCisgKi8KKworI2lmbmRlZiBfX01QU0NfSF9fCisjZGVmaW5lIF9fTVBTQ19IX18KKworLyogaW5jbHVkZSBhY3R1YWwgR2FsaWxlbyBkZWZpbmVzICovCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tdl9nZW5fcmVnLmgiCisKKy8qIGRyaXZlciByZWxhdGVkIGRlZmluZXMgKi8KKworaW50IG1wc2NfaW5pdChpbnQgYmF1ZCk7Cit2b2lkIG1wc2Nfc2RtYV9pbml0KHZvaWQpOwordm9pZCBtcHNjX2luaXQyKHZvaWQpOworaW50IGdhbGJyZ19zZXRfYmF1ZHJhdGUoaW50IGNoYW5uZWwsIGludCByYXRlKTsKKworaW50IG1wc2NfcHV0Y2hhcl9lYXJseShjaGFyIGNoKTsKK2NoYXIgbXBzY19nZXRjaGFyX2RlYnVnKHZvaWQpOworaW50IG1wc2NfdGVzdF9jaGFyX2RlYnVnKHZvaWQpOworCitpbnQgbXBzY190ZXN0X2NoYXJfc2RtYSh2b2lkKTsKKworZXh0ZXJuIGludCAoKm1wc2NfcHV0Y2hhcikoY2hhciBjaCk7CitleHRlcm4gY2hhciAoKm1wc2NfZ2V0Y2hhcikodm9pZCk7CitleHRlcm4gaW50ICgqbXBzY190ZXN0X2NoYXIpKHZvaWQpOworCisjZGVmaW5lIENIQU5ORUwgQ09ORklHX01QU0NfUE9SVAorCisjZGVmaW5lIFRYX0RFU0MgICAgIDUKKyNkZWZpbmUgUlhfREVTQyAgICAgMjAKKworI2RlZmluZSBERVNDX0ZJUlNUICAweDAwMDEwMDAwCisjZGVmaW5lIERFU0NfTEFTVCAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgREVTQ19PV05FUl9CSVQgIDB4ODAwMDAwMDAKKworI2RlZmluZSBUWF9ERU1BTkQgICAweDAwODAwMDAwCisjZGVmaW5lIFRYX1NUT1AgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUlhfRU5BQkxFICAgMHgwMDAwMDA4MAorCisjZGVmaW5lIFNETUFfUlhfQUJPUlQgCQkgICgxIDw8IDE1KQorI2RlZmluZSBTRE1BX1RYX0FCT1JUIAkJICAoMSA8PCAzMSkKKyNkZWZpbmUgTVBTQ19UWF9BQk9SVCAJCSAgKDEgPDwgNykKKyNkZWZpbmUgTVBTQ19SWF9BQk9SVCAgICAgICAgICAgICAoMSA8PCAyMykKKyNkZWZpbmUgTVBTQ19FTlRFUl9IVU5UICAgICAgICAgICAoMSA8PCAzMSkKKworLyogTVBTQyBkZWZpbmVzICovCisKKyNkZWZpbmUgR0FMTVBTQ19DT05ORUNUICAgICAgICAgICAgMHgxCisjZGVmaW5lIEdBTE1QU0NfRElTQ09OTkVDVCAgICAgICAgIDB4MAorCisjZGVmaW5lIEdBTE1QU0NfVUFSVCAgICAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIEdBTE1QU0NfU1RPUF9CSVRTXzEgICAgICAgIDB4MAorI2RlZmluZSBHQUxNUFNDX1NUT1BfQklUU18yICAgICAgICAweDEKKyNkZWZpbmUgR0FMTVBTQ19DSEFSX0xFTkdUSF84ICAgICAgMHgzCisjZGVmaW5lIEdBTE1QU0NfQ0hBUl9MRU5HVEhfNyAgICAgIDB4MgorCisjZGVmaW5lIEdBTE1QU0NfUEFSSVRZX09ERCAgICAgICAgIDB4MAorI2RlZmluZSBHQUxNUFNDX1BBUklUWV9FVkVOICAgICAgICAweDIKKyNkZWZpbmUgR0FMTVBTQ19QQVJJVFlfTUFSSyAgICAgICAgMHgzCisjZGVmaW5lIEdBTE1QU0NfUEFSSVRZX1NQQUNFICAgICAgIDB4MQorI2RlZmluZSBHQUxNUFNDX1BBUklUWV9OT05FICAgICAgICAtMQorCisjZGVmaW5lIEdBTE1QU0NfU0VSSUFMX01VTFRJUExFWCAgIFNFUklBTF9QT1JUX01VTFRJUExFWCAgICAgICAgICAgLyogMHhmMDEwICovCisjZGVmaW5lIEdBTE1QU0NfUk9VVElOR19SRUdJU1RFUiAgIE1BSU5fUk9VVElOR19SRUdJU1RFUiAgICAgICAgICAgLyogMHhiNDAwICovCisjZGVmaW5lIEdBTE1QU0NfUnhDX1JPVVRFICAgICAgICAgIFJFQ0VJVkVfQ0xPQ0tfUk9VVElOR19SRUdJU1RFUiAgLyogMHhiNDA0ICovCisjZGVmaW5lIEdBTE1QU0NfVHhDX1JPVVRFICAgICAgICAgIFRSQU5TTUlUX0NMT0NLX1JPVVRJTkdfUkVHSVNURVIgLyogMHhiNDA4ICovCisjZGVmaW5lIEdBTE1QU0NfTUNPTkZfTE9XICAgICAgICAgIE1QU0MwX01BSU5fQ09ORklHVVJBVElPTl9MT1cgICAgLyogMHg4MDAwICovCisjZGVmaW5lIEdBTE1QU0NfTUNPTkZfSElHSCAgICAgICAgIE1QU0MwX01BSU5fQ09ORklHVVJBVElPTl9ISUdIICAgLyogMHg4MDA0ICovCisjZGVmaW5lIEdBTE1QU0NfUFJPVE9DT05GX1JFRyAgICAgIE1QU0MwX1BST1RPQ09MX0NPTkZJR1VSQVRJT04gICAgLyogMHg4MDA4ICovCisKKyNkZWZpbmUgR0FMTVBTQ19SRUdfR0FQICAgICAgICAgICAgMHgxMDAwCisKKyNkZWZpbmUgR0FMTVBTQ19NQ09ORl9DSFJFR19CQVNFICAgQ0hBTk5FTDBfUkVHSVNURVIxICAvKiAweDgwMGMgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzEgICAgICAgQ0hBTk5FTDBfUkVHSVNURVIxICAvKiAweDgwMGMgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzIgICAgICAgQ0hBTk5FTDBfUkVHSVNURVIyICAvKiAweDgwMTAgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzMgICAgICAgQ0hBTk5FTDBfUkVHSVNURVIzICAvKiAweDgwMTQgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzQgICAgICAgQ0hBTk5FTDBfUkVHSVNURVI0ICAvKiAweDgwMTggKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzUgICAgICAgQ0hBTk5FTDBfUkVHSVNURVI1ICAvKiAweDgwMWMgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzYgICAgICAgQ0hBTk5FTDBfUkVHSVNURVI2ICAvKiAweDgwMjAgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzcgICAgICAgQ0hBTk5FTDBfUkVHSVNURVI3ICAvKiAweDgwMjQgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzggICAgICAgQ0hBTk5FTDBfUkVHSVNURVI4ICAvKiAweDgwMjggKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzkgICAgICAgQ0hBTk5FTDBfUkVHSVNURVI5ICAvKiAweDgwMmMgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzEwICAgICAgQ0hBTk5FTDBfUkVHSVNURVIxMCAvKiAweDgwMzAgKi8KKyNkZWZpbmUgR0FMTVBTQ19DSEFOTkVMUkVHXzExICAgICAgQ0hBTk5FTDBfUkVHSVNURVIxMSAvKiAweDgwMzQgKi8KKworI2RlZmluZSBHQUxTRE1BX0NPTU1BTkRfRklSU1QgICAgICgxIDw8IDE2KQorI2RlZmluZSBHQUxTRE1BX0NPTU1BTkRfTEFTVCAgICAgICgxIDw8IDE3KQorI2RlZmluZSBHQUxTRE1BX0NPTU1BTkRfRU5BQkxFSU5UICgxIDw8IDIzKQorI2RlZmluZSBHQUxTRE1BX0NPTU1BTkRfQVVUTyAgICAgICgxIDw8IDMwKQorI2RlZmluZSBHQUxTRE1BX0NPTU1BTkRfT1dORVIgICAgICgxIDw8IDMxKQorCisjZGVmaW5lIEdBTFNETUFfUlggICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0FMU0RNQV9UWCAgICAgICAgICAgICAgICAgMQorCisvKiBDSEFOTkVMMiBzaG91bGQgYmUgQ0hBTk5FTDEsIGFjY29yZGluZyB0byBkb2N1bWVudGF0aW9uLAorICogYnV0IHRvIHdvcmsgd2l0aCB0aGUgY3VycmVudCBHVFJFR1MgZmlsZS4uLgorICovCisjZGVmaW5lIEdBTFNETUFfMF9DT05GX1JFRyAgICAgICAgIENIQU5ORUwwX0NPTkZJR1VSQVRJT05fUkVHSVNURVIgICAvKiAweDQwMDAgKi8KKyNkZWZpbmUgR0FMU0RNQV8xX0NPTkZfUkVHICAgICAgICAgQ0hBTk5FTDJfQ09ORklHVVJBVElPTl9SRUdJU1RFUiAgIC8qIDB4NjAwMCAqLworI2RlZmluZSBHQUxTRE1BXzBfQ09NX1JFRyAgICAgICAgICBDSEFOTkVMMF9DT01NQU5EX1JFR0lTVEVSICAgICAgICAgLyogMHg0MDA4ICovCisjZGVmaW5lIEdBTFNETUFfMV9DT01fUkVHICAgICAgICAgIENIQU5ORUwyX0NPTU1BTkRfUkVHSVNURVIgICAgICAgICAvKiAweDYwMDggKi8KKyNkZWZpbmUgR0FMU0RNQV8wX0NVUl9SWF9QVFIgICAgICAgQ0hBTk5FTDBfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIgIC8qIDB4NDgxMCAqLworI2RlZmluZSBHQUxTRE1BXzBfQ1VSX1RYX1BUUiAgICAgICBDSEFOTkVMMF9DVVJSRU5UX1RYX0RFU0NSSVBUT1JfUE9JTlRFUiAgLyogMHg0YzEwICovCisjZGVmaW5lIEdBTFNETUFfMF9GSVJfVFhfUFRSICAgICAgIENIQU5ORUwwX0ZJUlNUX1RYX0RFU0NSSVBUT1JfUE9JTlRFUiAgICAvKiAweDRjMTQgKi8KKyNkZWZpbmUgR0FMU0RNQV8xX0NVUl9SWF9QVFIgICAgICAgQ0hBTk5FTDJfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIgIC8qIDB4NjgxMCAqLworI2RlZmluZSBHQUxTRE1BXzFfQ1VSX1RYX1BUUiAgICAgICBDSEFOTkVMMl9DVVJSRU5UX1RYX0RFU0NSSVBUT1JfUE9JTlRFUiAgLyogMHg2YzEwICovCisjZGVmaW5lIEdBTFNETUFfMV9GSVJfVFhfUFRSICAgICAgIENIQU5ORUwyX0ZJUlNUX1RYX0RFU0NSSVBUT1JfUE9JTlRFUiAgICAvKiAweDZjMTQgKi8KKyNkZWZpbmUgR0FMU0RNQV9SRUdfRElGRiAgICAgICAgICAgMHgyMDAwCisKKy8qIFdST05HIGluIGd0NjQyNjBSLmggKi8KKyNkZWZpbmUgR0FMU0RNQV9JTlRfQ0FVU0UgICAgICAgICAgMHhiODAwICAgLyogU0RNQV9DQVVTRSAqLworI2RlZmluZSBHQUxTRE1BX0lOVF9NQVNLICAgICAgICAgICAweGI4ODAgICAvKiBTRE1BX01BU0sgICovCisjZGVmaW5lIEdBTE1QU0NfMF9JTlRfQ0FVU0UgICAgICAgIDB4YjgwNAorI2RlZmluZSBHQUxNUFNDXzBfSU5UX01BU0sgICAgICAgICAweGI4ODQKKworI2RlZmluZSBHQUxTRE1BX01PREVfVUFSVCAgICAgICAgICAwCisjZGVmaW5lIEdBTFNETUFfTU9ERV9CSVNZTkMgICAgICAgIDEKKyNkZWZpbmUgR0FMU0RNQV9NT0RFX0hETEMgICAgICAgICAgMgorI2RlZmluZSBHQUxTRE1BX01PREVfVFJBTlNQQVJFTlQgICAzCisKKyNkZWZpbmUgR0FMQlJHXzBfQ09ORlJFRyAgICAgICAgICAgQlJHMF9DT05GSUdVUkFUSU9OX1JFR0lTVEVSICAvKiAgMHhiMjAwICAqLworI2RlZmluZSBHQUxCUkdfUkVHX0dBUCAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgR0FMQlJHXzBfQlRSRUcgICAgICAgICAgICAgQlJHMF9CQVVERV9UVU5JTkdfUkVHSVNURVIgICAvKiAgMHhiMjA0ICAqLworCisjZW5kaWYgLyogX19NUFNDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL212X2V0aC5jIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL212X2V0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvbXZfZXRoLmMKQEAgLTAsMCArMSwzMTgyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBJbmdvIEFzc211cyA8aW5nby5hc3NtdXNAa2V5bWlsZS5jb20+CisgKgorICogYmFzZWQgb24gLSBEcml2ZXIgZm9yIE1WNjQzNjBYIGV0aGVybmV0IHBvcnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgcmFiZWVoQGdhbGlsZW8uY28uaWwKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogbXZfZXRoLmMgLSBoZWFkZXIgZmlsZSBmb3IgdGhlIHBvbGxlZCBtb2RlIEdUIGV0aGVybmV0IGRyaXZlcgorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpbmNsdWRlICJtdl9ldGguaCIKKworLyogZW5hYmxlIERlYnVnIG91dHB1dHMgKi8KKworI3VuZGVmIERFQlVHX01WX0VUSAorCisjaWZkZWYgREVCVUdfTVZfRVRICisjZGVmaW5lIERFQlVHCisjZGVmaW5lIERQKHgpIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworI3VuZGVmIE1WNjQzNjBfQ0hFQ0tTVU1fT0ZGTE9BRAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgVGhlIGZpcnN0IHBhcnQgaXMgdGhlIGhpZ2ggbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLiAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVmaW5pdGlvbiBmb3IgY29uZmlndXJpbmcgZHJpdmVyICovCisvKiAjZGVmaW5lIFVQREFURV9TVEFUU19CWV9TT0ZUV0FSRSAqLworI3VuZGVmIE1WNjQzNjBfUlhfUVVFVUVfRklMTF9PTl9UQVNLCisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIE1BR0lDX0VUSF9SVU5OSU5HCQk4MDMxOTcxCisjZGVmaW5lIE1WNjQzNjBfSU5URVJOQUxfU1JBTV9TSVpFICAgICAgICAgICAgICAgICAgICAgIF8yNTZLCisjZGVmaW5lIEVYVFJBX0JZVEVTIDMyCisjZGVmaW5lIFdSQVAgICAgICAgRVRIX0hMRU4gKyAyICsgNCArIDE2CisjZGVmaW5lIEJVRkZFUl9NVFUgZGV2LT5tdHUgKyBXUkFQCisjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMCQkweDAwMDdmZmZmCisjZGVmaW5lIElOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVAkweDAwMTFmZmZmCisjaWZkZWYgTVY2NDM2MF9SWF9GSUxMX09OX1RBU0sKKyNkZWZpbmUgSU5UX0NBVVNFX01BU0tfQUxMCQkweDAwMDAwMDAwCisjZGVmaW5lIElOVF9DQVVTRV9DSEVDS19CSVRTCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTAorI2RlZmluZSBJTlRfQ0FVU0VfQ0hFQ0tfQklUU19FWFQJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUCisjZW5kaWYKKworLyogUmVhZC9Xcml0ZSB0by9mcm9tIE1WNjQzNjAgaW50ZXJuYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1WX1JFR19SRUFEKG9mZnNldCkgbXlfbGUzMl90b19jcHUoKiAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChJTlRFUk5BTF9SRUdfQkFTRV9BRERSICsgb2Zmc2V0KSkKKyNkZWZpbmUgTVZfUkVHX1dSSVRFKG9mZnNldCxkYXRhKSAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoSU5URVJOQUxfUkVHX0JBU0VfQUREUiArIG9mZnNldCkgPSBteV9jcHVfdG9fbGUzMiAoZGF0YSkKKyNkZWZpbmUgTVZfU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKSAoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKChJTlRFUk5BTF9SRUdfQkFTRV9BRERSKSArIChyZWdPZmZzZXQpKSkpIHw9ICgodW5zaWduZWQgaW50KW15X2NwdV90b19sZTMyKGJpdHMpKSkKKyNkZWZpbmUgTVZfUkVTRVRfUkVHX0JJVFMocmVnT2Zmc2V0LGJpdHMpICgoKigodm9sYXRpbGUgdW5zaWduZWQgaW50KikoKElOVEVSTkFMX1JFR19CQVNFX0FERFIpICsgKHJlZ09mZnNldCkpKSkgJj0gfigodW5zaWduZWQgaW50KW15X2NwdV90b19sZTMyKGJpdHMpKSkKKworLyogU3RhdGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworc3RhdGljIGludCBtdjY0MzYwX2V0aF9yZWFsX29wZW4gKHN0cnVjdCBldGhfZGV2aWNlICpldGgpOworc3RhdGljIGludCBtdjY0MzYwX2V0aF9yZWFsX3N0b3AgKHN0cnVjdCBldGhfZGV2aWNlICpldGgpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptdjY0MzYwX2V0aF9nZXRfc3RhdHMgKHN0cnVjdCBldGhfZGV2aWNlCisJCQkJCQkgICAgICAgKmRldik7CitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0X21hY190YWJsZXMgKEVUSF9QT1JUIGV0aF9wb3J0X251bSk7CitzdGF0aWMgdm9pZCBtdjY0MzYwX2V0aF91cGRhdGVfc3RhdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7Citib29sIGRiNjQzNjBfZXRoX3N0YXJ0IChzdHJ1Y3QgZXRoX2RldmljZSAqZXRoKTsKK3Vuc2lnbmVkIGludCBldGhfcmVhZF9taWJfY291bnRlciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgIHVuc2lnbmVkIGludCBtaWJfb2Zmc2V0KTsKK2ludCBtdjY0MzYwX2V0aF9yZWNlaXZlIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KTsKKworaW50IG12NjQzNjBfZXRoX3htaXQgKHN0cnVjdCBldGhfZGV2aWNlICosIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwgaW50IGxlbmd0aCk7CisKKyNpZm5kZWYgIFVQREFURV9TVEFUU19CWV9TT0ZUV0FSRQorc3RhdGljIHZvaWQgbXY2NDM2MF9ldGhfcHJpbnRfc3RhdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7CisjZW5kaWYKKy8qIFByb2Nlc3NlcyBhIHJlY2VpdmVkIHBhY2tldCAqLworZXh0ZXJuIHZvaWQgTmV0UmVjZWl2ZSAodm9sYXRpbGUgdWNoYXIgKiwgaW50KTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBJTlRFUk5BTF9SRUdfQkFTRV9BRERSOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICpIZWxwZXIgZnVuY3Rpb25zIC0gdXNlZCBpbnNpZGUgdGhlIGRyaXZlciBvbmx5ICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIERFQlVHX01WX0VUSAordm9pZCBwcmludF9nbG9iYWxzIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCXByaW50ZiAoIkV0aGVybmV0IFBSSU5UX0dsb2JhbHMtRGVidWcgZnVuY3Rpb25cbiIpOworCXByaW50ZiAoIkJhc2UgQWRkcmVzcyBmb3IgRVRIX1BPUlRfSU5GTzoJJTA4eFxuIiwKKwkJKHVuc2lnbmVkIGludCkgZGV2LT5wcml2KTsKKwlwcmludGYgKCJCYXNlIEFkZHJlc3MgZm9yIG12NjQzNjBfZXRoX3ByaXY6CSUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpICYoKChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdiktPgorCQkJCSBwb3J0X3ByaXZhdGUpKTsKKworCXByaW50ZiAoIkdUIEludGVybmFsIEJhc2UgQWRkcmVzczoJJTA4eFxuIiwKKwkJSU5URVJOQUxfUkVHX0JBU0VfQUREUik7CisJcHJpbnRmICgiQmFzZSBBZGRyZXNzIGZvciBUWC1ERVNDczoJJTA4eAlOdW1iZXIgb2YgYWxsb2NhdGVkIEJ1ZmZlcnMgJWRcbiIsICh1bnNpZ25lZCBpbnQpICgoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXYpLT5wX3R4X2Rlc2NfYXJlYV9iYXNlWzBdLCBNVjY0MzYwX1RYX1FVRVVFX1NJWkUpOworCXByaW50ZiAoIkJhc2UgQWRkcmVzcyBmb3IgUlgtREVTQ3M6CSUwOHgJTnVtYmVyIG9mIGFsbG9jYXRlZCBCdWZmZXJzICVkXG4iLCAodW5zaWduZWQgaW50KSAoKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2KS0+cF9yeF9kZXNjX2FyZWFfYmFzZVswXSwgTVY2NDM2MF9SWF9RVUVVRV9TSVpFKTsKKwlwcmludGYgKCJCYXNlIEFkZHJlc3MgZm9yIFJYLUJ1ZmZlcjoJJTA4eAlhbGxvY2F0ZWQgQnl0ZXMgJWRcbiIsCisJCSh1bnNpZ25lZCBpbnQpICgoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXYpLT4KKwkJcF9yeF9idWZmZXJfYmFzZVswXSwKKwkJKE1WNjQzNjBfUlhfUVVFVUVfU0laRSAqIE1WNjQzNjBfUlhfQlVGRkVSX1NJWkUpICsgMzIpOworCXByaW50ZiAoIkJhc2UgQWRkcmVzcyBmb3IgVFgtQnVmZmVyOgklMDh4CWFsbG9jYXRlZCBCeXRlcyAlZFxuIiwKKwkJKHVuc2lnbmVkIGludCkgKChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdiktPgorCQlwX3R4X2J1ZmZlcl9iYXNlWzBdLAorCQkoTVY2NDM2MF9UWF9RVUVVRV9TSVpFICogTVY2NDM2MF9UWF9CVUZGRVJfU0laRSkgKyAzMik7Cit9CisjZW5kaWYKKworI2RlZmluZSBteV9jcHVfdG9fbGUzMih4KSBteV9sZTMyX3RvX2NwdSgoeCkpCisKK3Vuc2lnbmVkIGxvbmcgbXlfbGUzMl90b19jcHUgKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlyZXR1cm4gKCgoeCAmIDB4MDAwMDAwZmZVKSA8PCAyNCkgfAorCQkoKHggJiAweDAwMDBmZjAwVSkgPDwgOCkgfAorCQkoKHggJiAweDAwZmYwMDAwVSkgPj4gOCkgfCAoKHggJiAweGZmMDAwMDAwVSkgPj4gMjQpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfcHJpbnRfcGh5X3N0YXR1cworICoKKyAqIFByaW50cyBnaWdhYml0IGV0aGVucmV0IHBoeSBzdGF0dXMKKyAqCisgKiBJbnB1dCA6IHBvaW50ZXIgdG8gZXRoZXJuZXQgaW50ZXJmYWNlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogT3V0cHV0IDogTi9BCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbXY2NDM2MF9ldGhfcHJpbnRfcGh5X3N0YXR1cyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBwb3J0X3N0YXR1cywgcGh5X3JlZ19kYXRhOworCisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisKKwkvKiBDaGVjayBMaW5rIHN0YXR1cyBvbiBwaHkgKi8KKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcgKHBvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhKTsKKwlpZiAoIShwaHlfcmVnX2RhdGEgJiAweDIwKSkgeworCQlwcmludGYgKCJFdGhlcm5ldCBwb3J0IGNoYW5nZWQgbGluayBzdGF0dXMgdG8gRE9XTlxuIik7CisJfSBlbHNlIHsKKwkJcG9ydF9zdGF0dXMgPQorCQkJTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX1BPUlRfU1RBVFVTX1JFRyAocG9ydF9udW0pKTsKKwkJcHJpbnRmICgiRXRoZXJuZXQgc3RhdHVzIHBvcnQgJWQ6IExpbmsgdXAiLCBwb3J0X251bSk7CisJCXByaW50ZiAoIiwgJXMiLAorCQkJKHBvcnRfc3RhdHVzICYgQklUMikgPyAiRnVsbCBEdXBsZXgiIDogIkhhbGYgRHVwbGV4Iik7CisJCWlmIChwb3J0X3N0YXR1cyAmIEJJVDQpCisJCQlwcmludGYgKCIsIFNwZWVkIDEgR2JwcyIpOworCQllbHNlCisJCQlwcmludGYgKCIsICVzIiwKKwkJCQkocG9ydF9zdGF0dXMgJiBCSVQ1KSA/ICJTcGVlZCAxMDAgTWJwcyIgOgorCQkJCSJTcGVlZCAxMCBNYnBzIik7CisJCXByaW50ZiAoIlxuIik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdS1ib290IGVudHJ5IGZ1bmN0aW9ucyBmb3IgbXY2NDM2MF9ldGgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkYjY0MzYwX2V0aF9wcm9iZSAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChpbnQpIGRiNjQzNjBfZXRoX3N0YXJ0IChkZXYpKTsKK30KKworaW50IGRiNjQzNjBfZXRoX3BvbGwgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG12NjQzNjBfZXRoX3JlY2VpdmUgKGRldik7Cit9CisKK2ludCBkYjY0MzYwX2V0aF90cmFuc21pdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LAorCQkJICBpbnQgbGVuZ3RoKQoreworCW12NjQzNjBfZXRoX3htaXQgKGRldiwgcGFja2V0LCBsZW5ndGgpOworCXJldHVybiAwOworfQorCit2b2lkIGRiNjQzNjBfZXRoX2Rpc2FibGUgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJbXY2NDM2MF9ldGhfc3RvcCAoZGV2KTsKK30KKworCit2b2lkIG12NjQzNnhfZXRoX2luaXRpYWxpemUgKGJkX3QgKiBiaXMpCit7CisJc3RydWN0IGV0aF9kZXZpY2UgKmRldjsKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJaW50IGRldm51bSwgeCwgdGVtcDsKKwljaGFyICpzLCAqZSwgYnVmWzY0XTsKKworCWZvciAoZGV2bnVtID0gMDsgZGV2bnVtIDwgTVZfRVRIX0RFVlM7IGRldm51bSsrKSB7CisJCWRldiA9IGNhbGxvYyAoc2l6ZW9mICgqZGV2KSwgMSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGYgKCIlczogbXZfZW5ldCVkIGFsbG9jYXRpb24gZmFpbHVyZSwgJXNcbiIsCisJCQkJX19GVU5DVElPTl9fLCBkZXZudW0sICJldGhfZGV2aWNlIHN0cnVjdHVyZSIpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogbXVzdCBiZSBsZXNzIHRoYW4gTkFNRVNJWkUgKDE2KSAqLworCQlzcHJpbnRmIChkZXYtPm5hbWUsICJtdl9lbmV0JWQiLCBkZXZudW0pOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRmICgiSW5pdGlhbGl6aW5nICVzXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkJLyogRXh0cmFjdCB0aGUgTUFDIGFkZHJlc3MgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KKwkJc3dpdGNoIChkZXZudW0pIHsKKwkJY2FzZSAwOgorCQkJcyA9ICJldGhhZGRyIjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXMgPSAiZXRoMWFkZHIiOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJcyA9ICJldGgyYWRkciI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCXByaW50ZiAoIiVzOiBJbnZhbGlkIGRldmljZSBudW1iZXIgJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBkZXZudW0pOworCQkJcmV0dXJuOworCQl9CisKKwkJdGVtcCA9IGdldGVudl9yIChzLCBidWYsIHNpemVvZiAoYnVmKSk7CisJCXMgPSAodGVtcCA+IDApID8gYnVmIDogTlVMTDsKKworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIlNldHRpbmcgTUFDICVkIHRvICVzXG4iLCBkZXZudW0sIHMpOworI2VuZGlmCisJCWZvciAoeCA9IDA7IHggPCA2OyArK3gpIHsKKwkJCWRldi0+ZW5ldGFkZHJbeF0gPSBzID8gc2ltcGxlX3N0cnRvdWwgKHMsICZlLCAxNikgOiAwOworCQkJaWYgKHMpCisJCQkJcyA9ICgqZSkgPyBlICsgMSA6IGU7CisJCX0KKwkJLyogcm9uZW4gLSBzZXQgdGhlIE1BQyBhZGRyIGluIHRoZSBIVyAqLworCQlldGhfcG9ydF91Y19hZGRyX3NldCAoZGV2bnVtLCBkZXYtPmVuZXRhZGRyLCAwKTsKKworCQlkZXYtPmluaXQgPSAodm9pZCAqKSBkYjY0MzYwX2V0aF9wcm9iZTsKKwkJZGV2LT5oYWx0ID0gKHZvaWQgKikgZXRoZXJuZXRfcGh5X3Jlc2V0OworCQlkZXYtPnNlbmQgPSAodm9pZCAqKSBkYjY0MzYwX2V0aF90cmFuc21pdDsKKwkJZGV2LT5yZWN2ID0gKHZvaWQgKikgZGI2NDM2MF9ldGhfcG9sbDsKKworCQlkZXYtPnByaXYgPSAodm9pZCAqKSBldGhlcm5ldF9wcml2YXRlID0KKwkJCWNhbGxvYyAoc2l6ZW9mICgqZXRoZXJuZXRfcHJpdmF0ZSksIDEpOworCQlpZiAoIWV0aGVybmV0X3ByaXZhdGUpIHsKKwkJCXByaW50ZiAoIiVzOiAlcyBhbGxvY2F0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLAorCQkJCSJQcml2YXRlIERldmljZSBTdHJ1Y3R1cmUiKTsKKwkJCWZyZWUgKGRldik7CisJCQlyZXR1cm47CisJCX0KKwkJLyogc3RhcnQgd2l0aCBhbiB6ZXJvZWQgRVRIX1BPUlRfSU5GTyAqLworCQltZW1zZXQgKGV0aGVybmV0X3ByaXZhdGUsIDAsIHNpemVvZiAoRVRIX1BPUlRfSU5GTykpOworCQltZW1jcHkgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbWFjX2FkZHIsIGRldi0+ZW5ldGFkZHIsIDYpOworCisJCS8qIHNldCBwb2ludGVyIHRvIG1lbW9yeSBmb3Igc3RhdHMgZGF0YSBzdHJ1Y3R1cmUgZXRjLi4uICovCisJCWV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZSA9ICh2b2lkICopIHBvcnRfcHJpdmF0ZSA9CisJCQljYWxsb2MgKHNpemVvZiAoKmV0aGVybmV0X3ByaXZhdGUpLCAxKTsKKwkJaWYgKCFwb3J0X3ByaXZhdGUpIHsKKwkJCXByaW50ZiAoIiVzOiAlcyBhbGxvY2F0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLAorCQkJCSJQb3J0IFByaXZhdGUgRGV2aWNlIFN0cnVjdHVyZSIpOworCisJCQlmcmVlIChldGhlcm5ldF9wcml2YXRlKTsKKwkJCWZyZWUgKGRldik7CisJCQlyZXR1cm47CisJCX0KKworCQlwb3J0X3ByaXZhdGUtPnN0YXRzID0KKwkJCWNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIDEpOworCQlpZiAoIXBvcnRfcHJpdmF0ZS0+c3RhdHMpIHsKKwkJCXByaW50ZiAoIiVzOiAlcyBhbGxvY2F0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLAorCQkJCSJOZXQgc3RhdCBTdHJ1Y3R1cmUiKTsKKworCQkJZnJlZSAocG9ydF9wcml2YXRlKTsKKwkJCWZyZWUgKGV0aGVybmV0X3ByaXZhdGUpOworCQkJZnJlZSAoZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1zZXQgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZSwgMCwKKwkJCXNpemVvZiAoc3RydWN0IG12NjQzNjBfZXRoX3ByaXYpKTsKKwkJc3dpdGNoIChkZXZudW0pIHsKKwkJY2FzZSAwOgorCQkJZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0gPSBFVEhfMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSA9IEVUSF8xOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtID0gRVRIXzI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZiAoIkludmFsaWQgZGV2aWNlIG51bWJlciAlZFxuIiwgZGV2bnVtKTsKKwkJCWJyZWFrOworCQl9OworCisJCXBvcnRfcHJpdmF0ZS0+cG9ydF9udW0gPSBkZXZudW07CisJCS8qCisJCSAqIFJlYWQgTUlCIGNvdW50ZXIgb24gdGhlIEdUIGluIG9yZGVyIHRvIHJlc2V0IHRoZW0sCisJCSAqIHRoZW4gemVybyBhbGwgdGhlIHN0YXRzIGZpZWxkcyBpbiBtZW1vcnkKKwkJICovCisJCW12NjQzNjBfZXRoX3VwZGF0ZV9zdGF0IChkZXYpOworCQltZW1zZXQgKHBvcnRfcHJpdmF0ZS0+c3RhdHMsIDAsCisJCQlzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJCS8qIEV4dHJhY3QgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGVudmlyb25tZW50ICovCisJCXN3aXRjaCAoZGV2bnVtKSB7CisJCWNhc2UgMDoKKwkJCXMgPSAiZXRoYWRkciI7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlzID0gImV0aDFhZGRyIjsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXMgPSAiZXRoMmFkZHIiOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlwcmludGYgKCIlczogSW52YWxpZCBkZXZpY2UgbnVtYmVyICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2bnVtKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRlbXAgPSBnZXRlbnZfciAocywgYnVmLCBzaXplb2YgKGJ1ZikpOworCQlzID0gKHRlbXAgPiAwKSA/IGJ1ZiA6IE5VTEw7CisKKyNpZmRlZiBERUJVRworCQlwcmludGYgKCJTZXR0aW5nIE1BQyAlZCB0byAlc1xuIiwgZGV2bnVtLCBzKTsKKyNlbmRpZgorCQlmb3IgKHggPSAwOyB4IDwgNjsgKyt4KSB7CisJCQlkZXYtPmVuZXRhZGRyW3hdID0gcyA/IHNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKKwkJCWlmIChzKQorCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOworCQl9CisKKwkJRFAgKHByaW50ZiAoIkFsbG9jYXRpbmcgZGVzY3JpcHRvciBhbmQgYnVmZmVyIHJpbmdzXG4iKSk7CisKKwkJZXRoZXJuZXRfcHJpdmF0ZS0+cF9yeF9kZXNjX2FyZWFfYmFzZVswXSA9CisJCQkoRVRIX1JYX0RFU0MgKikgbWVtYWxpZ24gKDE2LAorCQkJCQkJICBSWF9ERVNDX0FMSUdORURfU0laRSAqCisJCQkJCQkgIE1WNjQzNjBfUlhfUVVFVUVfU0laRSArIDEpOworCQlldGhlcm5ldF9wcml2YXRlLT5wX3R4X2Rlc2NfYXJlYV9iYXNlWzBdID0KKwkJCShFVEhfVFhfREVTQyAqKSBtZW1hbGlnbiAoMTYsCisJCQkJCQkgIFRYX0RFU0NfQUxJR05FRF9TSVpFICoKKwkJCQkJCSAgTVY2NDM2MF9UWF9RVUVVRV9TSVpFICsgMSk7CisKKwkJZXRoZXJuZXRfcHJpdmF0ZS0+cF9yeF9idWZmZXJfYmFzZVswXSA9CisJCQkoY2hhciAqKSBtZW1hbGlnbiAoMTYsCisJCQkJCSAgIE1WNjQzNjBfUlhfUVVFVUVfU0laRSAqCisJCQkJCSAgIE1WNjQzNjBfVFhfQlVGRkVSX1NJWkUgKyAxKTsKKwkJZXRoZXJuZXRfcHJpdmF0ZS0+cF90eF9idWZmZXJfYmFzZVswXSA9CisJCQkoY2hhciAqKSBtZW1hbGlnbiAoMTYsCisJCQkJCSAgIE1WNjQzNjBfUlhfUVVFVUVfU0laRSAqCisJCQkJCSAgIE1WNjQzNjBfVFhfQlVGRkVSX1NJWkUgKyAxKTsKKworI2lmZGVmIERFQlVHX01WX0VUSAorCQkvKiBERUJVRyBPVVRQVVQgcHJpbnRzIGFkcmVzc2VzIG9mIGdsb2JhbHMgKi8KKwkJcHJpbnRfZ2xvYmFscyAoZGV2KTsKKyNlbmRpZgorCQlldGhfcmVnaXN0ZXIgKGRldik7CisKKwl9CisJRFAgKHByaW50ZiAoIiVzOiBleGl0XG4iLCBfX0ZVTkNUSU9OX18pKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfb3BlbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gb3Blbm5pbmcgdGhlIG5ldHdvcmsgZGV2aWNlLiBUaGUgZnVuY3Rpb24KKyAqIHNob3VsZCBpbml0aWFsaXplIGFsbCB0aGUgaGFyZHdhcmUsIGluaXRpYWxpemUgY3ljbGljIFJ4L1R4CisgKiBkZXNjcmlwdG9ycyBjaGFpbiBhbmQgYnVmZmVycyBhbmQgYWxsb2NhdGUgYW4gSVJRIHRvIHRoZSBuZXR3b3JrCisgKiBkZXZpY2UuCisgKgorICogSW5wdXQgOiBhIHBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogLyAvIHJvbmVuIC0gY2hhbmdlZCB0aGUgb3V0cHV0IHRvIG1hdGNoICBuZXQvZXRoLmMgbmVlZHMKKyAqIE91dHB1dCA6IG5vbnplcm8gb2Ygc3VjY2VzcyAsIHplcm8gaWYgZmFpbHMuCisgKiB1bmRlciBjb25zdHJ1Y3Rpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbXY2NDM2MF9ldGhfb3BlbiAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKG12NjQzNjBfZXRoX3JlYWxfb3BlbiAoZGV2KSk7Cit9CisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgbXY2NDM2MF9ldGhfb3BlbiAqLworc3RhdGljIGludCBtdjY0MzYwX2V0aF9yZWFsX29wZW4gKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisKKwl1bnNpZ25lZCBpbnQgcXVldWU7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKwl1MzIgcG9ydF9zdGF0dXMsIHBoeV9yZWdfZGF0YTsKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJLyogcm9uZW4gLSB3aGVuIHdlIHVwZGF0ZSB0aGUgTUFDIGVudiBwYXJhbXMgd2Ugb25seSB1cGRhdGUgZGV2LT5lbmV0YWRkcgorCSAgIHNlZSAuL25ldC9ldGguYyBldGhfc2V0X2VuZXRhZGRyKCkgKi8KKwltZW1jcHkgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbWFjX2FkZHIsIGRldi0+ZW5ldGFkZHIsIDYpOworCisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisKKwkvKiBTdG9wIFJYIFF1ZXVlcyAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyAocG9ydF9udW0pLAorCQkgICAgICAweDAwMDBmZjAwKTsKKworCS8qIENsZWFyIHRoZSBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcgKHBvcnRfbnVtKSwgMCk7CisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyAocG9ydF9udW0pLCAwKTsKKworCS8qIFVubWFzayBSWCBidWZmZXIgYW5kIFRYIGVuZCBpbnRlcnJ1cHQgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyAocG9ydF9udW0pLAorCQkgICAgICBJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7CisKKwkvKiBVbm1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcgKHBvcnRfbnVtKSwKKwkJICAgICAgSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUKTsKKworCS8qIFNldCBwaHkgYWRkcmVzcyBvZiB0aGUgcG9ydCAqLworCWV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcGh5X2FkZHIgPSAweDggKyBwb3J0X251bTsKKworCS8qIEFjdGl2YXRlIHRoZSBETUEgY2hhbm5lbHMgZXRjICovCisJZXRoX3BvcnRfaW5pdCAoZXRoZXJuZXRfcHJpdmF0ZSk7CisKKworCS8qICJBbGxvY2F0ZSIgc2V0dXAgVFggcmluZ3MgKi8KKworCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IE1WNjQzNjBfVFhfUVVFVUVfTlVNOyBxdWV1ZSsrKSB7CisJCXVuc2lnbmVkIGludCBzaXplOworCisJCXBvcnRfcHJpdmF0ZS0+dHhfcmluZ19zaXplW3F1ZXVlXSA9IE1WNjQzNjBfVFhfUVVFVUVfU0laRTsKKwkJc2l6ZSA9IChwb3J0X3ByaXZhdGUtPnR4X3Jpbmdfc2l6ZVtxdWV1ZV0gKiBUWF9ERVNDX0FMSUdORURfU0laRSk7CS8qc2l6ZSA9IG5vIG9mIERFU0NzIHRpbWVzIERFU0Mtc2l6ZSAqLworCQlldGhlcm5ldF9wcml2YXRlLT50eF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0gPSBzaXplOworCisJCS8qIGZpcnN0IGNsZWFyIGRlc2MgYXJlYSBjb21wbGV0ZWx5ICovCisJCW1lbXNldCAoKHZvaWQgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cF90eF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0sCisJCQkwLCBldGhlcm5ldF9wcml2YXRlLT50eF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0pOworCisJCS8qIGluaXRpYWxpemUgdHggZGVzYyByaW5nIHdpdGggbG93IGxldmVsIGRyaXZlciAqLworCQlpZiAoZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcKKwkJICAgIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsCisJCSAgICAgcG9ydF9wcml2YXRlLT50eF9yaW5nX3NpemVbcXVldWVdLAorCQkgICAgIE1WNjQzNjBfVFhfQlVGRkVSX1NJWkUgLyogRWFjaCBCdWZmZXIgaXMgMTYwMCBCeXRlICovICwKKwkJICAgICAodW5zaWduZWQgaW50KSBldGhlcm5ldF9wcml2YXRlLT4KKwkJICAgICBwX3R4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSwKKwkJICAgICAodW5zaWduZWQgaW50KSBldGhlcm5ldF9wcml2YXRlLT4KKwkJICAgICBwX3R4X2J1ZmZlcl9iYXNlW3F1ZXVlXSkgPT0gZmFsc2UpCisJCQlwcmludGYgKCIjIyMgRXJyb3IgaW5pdGlhbGl6aW5nIFRYIFJpbmdcbiIpOworCX0KKworCS8qICJBbGxvY2F0ZSIgc2V0dXAgUlggcmluZ3MgKi8KKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNVjY0MzYwX1JYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCQkvKiBNZWFudGltZSBSWCBSaW5nIGFyZSBmaXhlZCAtIGJ1dCBtdXN0IGJlIGNvbmZpZ3VyYWJsZSBieSB1c2VyICovCisJCXBvcnRfcHJpdmF0ZS0+cnhfcmluZ19zaXplW3F1ZXVlXSA9IE1WNjQzNjBfUlhfUVVFVUVfU0laRTsKKwkJc2l6ZSA9IChwb3J0X3ByaXZhdGUtPnJ4X3Jpbmdfc2l6ZVtxdWV1ZV0gKgorCQkJUlhfREVTQ19BTElHTkVEX1NJWkUpOworCQlldGhlcm5ldF9wcml2YXRlLT5yeF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0gPSBzaXplOworCisJCS8qIGZpcnN0IGNsZWFyIGRlc2MgYXJlYSBjb21wbGV0ZWx5ICovCisJCW1lbXNldCAoKHZvaWQgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cF9yeF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0sCisJCQkwLCBldGhlcm5ldF9wcml2YXRlLT5yeF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0pOworCQlpZiAoKGV0aGVyX2luaXRfcnhfZGVzY19yaW5nCisJCSAgICAgKGV0aGVybmV0X3ByaXZhdGUsIEVUSF9RMCwKKwkJICAgICAgcG9ydF9wcml2YXRlLT5yeF9yaW5nX3NpemVbcXVldWVdLAorCQkgICAgICBNVjY0MzYwX1JYX0JVRkZFUl9TSVpFIC8qIEVhY2ggQnVmZmVyIGlzIDE2MDAgQnl0ZSAqLyAsCisJCSAgICAgICh1bnNpZ25lZCBpbnQpIGV0aGVybmV0X3ByaXZhdGUtPgorCQkgICAgICBwX3J4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSwKKwkJICAgICAgKHVuc2lnbmVkIGludCkgZXRoZXJuZXRfcHJpdmF0ZS0+CisJCSAgICAgIHBfcnhfYnVmZmVyX2Jhc2VbcXVldWVdKSkgPT0gZmFsc2UpCisJCQlwcmludGYgKCIjIyMgRXJyb3IgaW5pdGlhbGl6aW5nIFJYIFJpbmdcbiIpOworCX0KKworCWV0aF9wb3J0X3N0YXJ0IChldGhlcm5ldF9wcml2YXRlKTsKKworCS8qIFNldCBtYXhpbXVtIHJlY2VpdmUgYnVmZmVyIHRvIDk3MDAgYnl0ZXMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHIChwb3J0X251bSksCisJCSAgICAgICgweDUgPDwgMTcpIHwKKwkJICAgICAgKE1WX1JFR19SRUFECisJCSAgICAgICAoTVY2NDM2MF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcgKHBvcnRfbnVtKSkKKwkJICAgICAgICYgMHhmZmYxZmZmZikpOworCisJLyoKKwkgKiBTZXQgZXRoZXJuZXQgTVRVIGZvciBsZWFreSBidWNrZXQgbWVjaGFuaXNtIHRvIDAgLSB0aGlzIHdpbGwKKwkgKiBkaXNhYmxlIHRoZSBsZWFreSBidWNrZXQgbWVjaGFuaXNtIC4KKwkgKi8KKworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfTUFYSU1VTV9UUkFOU01JVF9VTklUIChwb3J0X251bSksIDApOworCXBvcnRfc3RhdHVzID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX1BPUlRfU1RBVFVTX1JFRyAocG9ydF9udW0pKTsKKworCS8qIENoZWNrIExpbmsgc3RhdHVzIG9uIHBoeSAqLworCWV0aF9wb3J0X3JlYWRfc21pX3JlZyAocG9ydF9udW0sIDEsICZwaHlfcmVnX2RhdGEpOworCWlmICghKHBoeV9yZWdfZGF0YSAmIDB4MjApKSB7CisJCS8qIFJlc2V0IFBIWSAqLworCQlpZiAoKGV0aGVybmV0X3BoeV9yZXNldCAocG9ydF9udW0pKSAhPSB0cnVlKSB7CisJCQlwcmludGYgKCIkJCBXYXJubmluZzogTm8gbGluayBvbiBwb3J0ICVkIFxuIiwKKwkJCQlwb3J0X251bSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWV0aF9wb3J0X3JlYWRfc21pX3JlZyAocG9ydF9udW0sIDEsICZwaHlfcmVnX2RhdGEpOworCQkJaWYgKCEocGh5X3JlZ19kYXRhICYgMHgyMCkpIHsKKwkJCQlwcmludGYgKCIjIyMgRXJyb3I6IFBoeSBpcyBub3QgYWN0aXZlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW12NjQzNjBfZXRoX3ByaW50X3BoeV9zdGF0dXMgKGRldik7CisJfQorCXBvcnRfcHJpdmF0ZS0+ZXRoX3J1bm5pbmcgPSBNQUdJQ19FVEhfUlVOTklORzsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IG12NjQzNjBfZXRoX2ZyZWVfdHhfcmluZ3MgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IHF1ZXVlOworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfY3Vycl9kZXNjOworCisJZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwlwb3J0X3ByaXZhdGUgPQorCQkoc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9wcml2YXRlOworCXBvcnRfbnVtID0gcG9ydF9wcml2YXRlLT5wb3J0X251bTsKKworCS8qIFN0b3AgVHggUXVldWVzICovCisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyAocG9ydF9udW0pLAorCQkgICAgICAweDAwMDBmZjAwKTsKKworCS8qIEZyZWUgVFggcmluZ3MgKi8KKwlEUCAocHJpbnRmICgiQ2xlYXJpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgVFggcXVldWVzLi4uICIpKTsKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNVjY0MzYwX1RYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQkvKiBGcmVlIG9uIFRYIHJpbmdzICovCisJCWZvciAocF90eF9jdXJyX2Rlc2MgPQorCQkgICAgIGV0aGVybmV0X3ByaXZhdGUtPnBfdHhfZGVzY19hcmVhX2Jhc2VbcXVldWVdOworCQkgICAgICgodW5zaWduZWQgaW50KSBwX3R4X2N1cnJfZGVzYyA8PSAodW5zaWduZWQgaW50KQorCQkgICAgICBldGhlcm5ldF9wcml2YXRlLT5wX3R4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSArCisJCSAgICAgIGV0aGVybmV0X3ByaXZhdGUtPnR4X2Rlc2NfYXJlYV9zaXplW3F1ZXVlXSk7CisJCSAgICAgcF90eF9jdXJyX2Rlc2MgPQorCQkgICAgIChFVEhfVFhfREVTQyAqKSAoKHVuc2lnbmVkIGludCkgcF90eF9jdXJyX2Rlc2MgKworCQkJCSAgICAgIFRYX0RFU0NfQUxJR05FRF9TSVpFKSkgeworCQkJLyogdGhpcyBpcyBpbnNpZGUgZm9yIGxvb3AgKi8KKwkJCWlmIChwX3R4X2N1cnJfZGVzYy0+cmV0dXJuX2luZm8gIT0gMCkgeworCQkJCXBfdHhfY3Vycl9kZXNjLT5yZXR1cm5faW5mbyA9IDA7CisJCQkJRFAgKHByaW50ZiAoImZyZWVkXG4iKSk7CisJCQl9CisJCX0KKwkJRFAgKHByaW50ZiAoIkRvbmVcbiIpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY2NDM2MF9ldGhfZnJlZV9yeF9yaW5ncyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgcXVldWU7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKwl2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF9yeF9jdXJyX2Rlc2M7CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisKKwkvKiBTdG9wIFJYIFF1ZXVlcyAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyAocG9ydF9udW0pLAorCQkgICAgICAweDAwMDBmZjAwKTsKKworCS8qIEZyZWUgUlggcmluZ3MgKi8KKwlEUCAocHJpbnRmICgiQ2xlYXJpbmcgcHJldmlvdXNseSBhbGxvY2F0ZWQgUlggcXVldWVzLi4uICIpKTsKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNVjY0MzYwX1JYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQkvKiBGcmVlIHByZWFsbG9jYXRlZCBza2IncyBvbiBSWCByaW5ncyAqLworCQlmb3IgKHBfcnhfY3Vycl9kZXNjID0KKwkJICAgICBldGhlcm5ldF9wcml2YXRlLT5wX3J4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXTsKKwkJICAgICAoKCh1bnNpZ25lZCBpbnQpIHBfcnhfY3Vycl9kZXNjIDwKKwkJICAgICAgICgodW5zaWduZWQgaW50KSBldGhlcm5ldF9wcml2YXRlLT4KKwkJCXBfcnhfZGVzY19hcmVhX2Jhc2VbcXVldWVdICsKKwkJCWV0aGVybmV0X3ByaXZhdGUtPnJ4X2Rlc2NfYXJlYV9zaXplW3F1ZXVlXSkpKTsKKwkJICAgICBwX3J4X2N1cnJfZGVzYyA9CisJCSAgICAgKEVUSF9SWF9ERVNDICopICgodW5zaWduZWQgaW50KSBwX3J4X2N1cnJfZGVzYyArCisJCQkJICAgICAgUlhfREVTQ19BTElHTkVEX1NJWkUpKSB7CisJCQlpZiAocF9yeF9jdXJyX2Rlc2MtPnJldHVybl9pbmZvICE9IDApIHsKKwkJCQlwX3J4X2N1cnJfZGVzYy0+cmV0dXJuX2luZm8gPSAwOworCQkJCURQIChwcmludGYgKCJmcmVlZFxuIikpOworCQkJfQorCQl9CisJCURQIChwcmludGYgKCJEb25lXG4iKSk7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfc3RvcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGNsb3NpbmcgdGhlIG5ldHdvcmsgZGV2aWNlLgorICogSXQgdXBkYXRlcyB0aGUgaGFyZHdhcmUsCisgKiByZWxlYXNlIGFsbCBtZW1vcnkgdGhhdCBob2xkcyBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBhbmQgcmVsZWFzZSB0aGUgSVJRLgorICogSW5wdXQgOiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6IHplcm8gaWYgc3VjY2VzcyAsIG5vbnplcm8gaWYgZmFpbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtdjY0MzYwX2V0aF9zdG9wIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisJLyogRGlzYWJsZSBhbGwgZ2lnRSBhZGRyZXNzIGRlY29kZXIgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0JBU0VfQUREUl9FTkFCTEVfUkVHLCAweDNmKTsKKwlEUCAocHJpbnRmICgiJXMgRXRoZXJuZXQgc3RvcCBjYWxsZWQgLi4uIFxuIiwgX19GVU5DVElPTl9fKSk7CisJbXY2NDM2MF9ldGhfcmVhbF9zdG9wIChkZXYpOworCisJcmV0dXJuIDA7Cit9OworCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG12NjQzNjBfZXRoX3N0b3AgKi8KKworc3RhdGljIGludCBtdjY0MzYwX2V0aF9yZWFsX3N0b3AgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisKKworCW12NjQzNjBfZXRoX2ZyZWVfdHhfcmluZ3MgKGRldik7CisJbXY2NDM2MF9ldGhfZnJlZV9yeF9yaW5ncyAoZGV2KTsKKworCWV0aF9wb3J0X3Jlc2V0IChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSk7CisJLyogRGlzYWJsZSBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcgKHBvcnRfbnVtKSwgMCk7CisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyAocG9ydF9udW0pLCAwKTsKKwkvKiBNYXNrIFJYIGJ1ZmZlciBhbmQgVFggZW5kIGludGVycnVwdCAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfSU5URVJSVVBUX01BU0tfUkVHIChwb3J0X251bSksIDApOworCS8qIE1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcgKHBvcnRfbnVtKSwgMCk7CisJTVZfUkVTRVRfUkVHX0JJVFMgKE1WNjQzNjBfQ1BVX0lOVEVSUlVQVDBfTUFTS19ISUdILAorCQkJICAgQklUMCA8PCBwb3J0X251bSk7CisJLyogUHJpbnQgTmV0d29yayBzdGF0aXN0aWNzICovCisjaWZuZGVmICBVUERBVEVfU1RBVFNfQllfU09GVFdBUkUKKwkvKgorCSAqIFByaW50IHN0YXRpc3RpY3MgKG9ubHkgaWYgZXRoZXJuZXQgaXMgcnVubmluZyksCisJICogdGhlbiB6ZXJvIGFsbCB0aGUgc3RhdHMgZmllbGRzIGluIG1lbW9yeQorCSAqLworCWlmIChwb3J0X3ByaXZhdGUtPmV0aF9ydW5uaW5nID09IE1BR0lDX0VUSF9SVU5OSU5HKSB7CisJCXBvcnRfcHJpdmF0ZS0+ZXRoX3J1bm5pbmcgPSAwOworCQltdjY0MzYwX2V0aF9wcmludF9zdGF0IChkZXYpOworCX0KKwltZW1zZXQgKHBvcnRfcHJpdmF0ZS0+c3RhdHMsIDAsIHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKyNlbmRpZgorCURQIChwcmludGYgKCJcbkV0aGVybmV0IHN0b3BwZWQgLi4uIFxuIikpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdjY0MzYwX2V0aF9zdGFydF94bWl0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBxdWV1ZXMgYSBwYWNrZXQgaW4gdGhlIFR4IGRlc2NyaXB0b3IgZm9yCisgKiByZXF1aXJlZCBwb3J0LgorICoKKyAqIElucHV0IDogc2tiIC0gYSBwb2ludGVyIHRvIHNvY2tldCBidWZmZXIKKyAqICAgICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSByZXF1aXJlZCBwb3J0CisgKgorICogT3V0cHV0IDogemVybyB1cG9uIHN1Y2Nlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbXY2NDM2MF9ldGhfeG1pdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqZGF0YVB0ciwKKwkJICAgICAgaW50IGRhdGFTaXplKQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJUEtUX0lORk8gcGt0X2luZm87CisJRVRIX0ZVTkNfUkVUX1NUQVRVUyBzdGF0dXM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCUVUSF9GVU5DX1JFVF9TVEFUVVMgcmVsZWFzZV9yZXN1bHQ7CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisJc3RhdHMgPSBwb3J0X3ByaXZhdGUtPnN0YXRzOworCisJLyogVXBkYXRlIHBhY2tldCBpbmZvIGRhdGEgc3RydWN0dXJlICovCisJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9UWF9GSVJTVF9ERVNDIHwgRVRIX1RYX0xBU1RfREVTQzsJLyogRE1BIG93bmVkLCBmaXJzdCBsYXN0ICovCisJcGt0X2luZm8uYnl0ZV9jbnQgPSBkYXRhU2l6ZTsKKwlwa3RfaW5mby5idWZfcHRyID0gKHVuc2lnbmVkIGludCkgZGF0YVB0cjsKKworCXN0YXR1cyA9IGV0aF9wb3J0X3NlbmQgKGV0aGVybmV0X3ByaXZhdGUsIEVUSF9RMCwgJnBrdF9pbmZvKTsKKwlpZiAoKHN0YXR1cyA9PSBFVEhfRVJST1IpIHx8IChzdGF0dXMgPT0gRVRIX1FVRVVFX0ZVTEwpKSB7CisJCXByaW50ZiAoIkVycm9yIG9uIHRyYW5zbWl0dGluZyBwYWNrZXQgLi4iKTsKKwkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfRlVMTCkKKwkJCXByaW50ZiAoIkVUSCBRdWV1ZSBpcyBmdWxsLiBcbiIpOworCQlpZiAoc3RhdHVzID09IEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFKQorCQkJcHJpbnRmICgiRVRIIFF1ZXVlOiB1c2luZyBsYXN0IGF2YWlsYWJsZSByZXNvdXJjZS4gXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyBhbmQgc3RhcnQgb2YgdHJhbnNtaXR0aW9uIHRpbWUgKi8KKwlzdGF0cy0+dHhfYnl0ZXMgKz0gZGF0YVNpemU7CisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKworCS8qIENoZWNrIGlmIHBhY2tldChzKSBpcyhhcmUpIHRyYW5zbWl0dGVkIGNvcnJlY3RseSAocmVsZWFzZSBldmVyeXRoaW5nKSAqLworCWRvIHsKKwkJcmVsZWFzZV9yZXN1bHQgPQorCQkJZXRoX3R4X3JldHVybl9kZXNjIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsCisJCQkJCSAgICAmcGt0X2luZm8pOworCQlzd2l0Y2ggKHJlbGVhc2VfcmVzdWx0KSB7CisJCWNhc2UgRVRIX09LOgorCQkJRFAgKHByaW50ZiAoImRlc2NyaXB0b3IgcmVsZWFzZWRcbiIpKTsKKwkJCWlmIChwa3RfaW5mby5jbWRfc3RzICYgQklUMCkgeworCQkJCXByaW50ZiAoIkVycm9yIGluIFRYXG4iKTsKKwkJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEVUSF9SRVRSWToKKwkJCURQIChwcmludGYgKCJ0cmFuc21pc3Npb24gc3RpbGwgaW4gcHJvY2Vzc1xuIikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVEhfRVJST1I6CisJCQlwcmludGYgKCJyb3V0aW5lIGNhbiBub3QgYWNjZXNzIFR4IGRlc2MgcmluZ1xuIik7CisJCQlicmVhazsKKworCQljYXNlIEVUSF9FTkRfT0ZfSk9COgorCQkJRFAgKHByaW50ZiAoInRoZSByb3V0aW5lIGhhcyBub3RoaW5nIHRvIHJlbGVhc2VcbiIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChyZWxlYXNlX3Jlc3VsdCA9PSBFVEhfT0spOworCisKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KKyAgICAgIGVycm9yOgorCXJldHVybiAxOwkJLyogRmFpbGVkIC0gaGlnaGVyIGxheWVycyB3aWxsIGZyZWUgdGhlIHNrYiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfcmVjZWl2ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yd2FyZCBwYWNrZXRzIHRoYXQgYXJlIHJlY2VpdmVkIGZyb20gdGhlIHBvcnQncworICogcXVldWVzIHRvd2FyZCBrZXJuZWwgY29yZSBvciBGYXN0Um91dGUgdGhlbSB0byBhbm90aGVyIGludGVyZmFjZS4KKyAqCisgKiBJbnB1dCA6IGRldiAtIGEgcG9pbnRlciB0byB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCisgKiAgICAgICAgIG1heCAtIG1heGltdW0gbnVtYmVyIHRvIHJlY2VpdmUgKDAgbWVhbnMgdW5saW10ZWQpCisgKgorICogT3V0cHV0IDogbnVtYmVyIG9mIHNlcnZlZCBwYWNrZXRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG12NjQzNjBfZXRoX3JlY2VpdmUgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKwlQS1RfSU5GTyBwa3RfaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisJc3RhdHMgPSBwb3J0X3ByaXZhdGUtPnN0YXRzOworCisJd2hpbGUgKChldGhfcG9ydF9yZWNlaXZlIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsICZwa3RfaW5mbykgPT0KKwkJRVRIX09LKSkgeworCisjaWZkZWYgREVCVUdfTVZfRVRICisJCWlmIChwa3RfaW5mby5ieXRlX2NudCAhPSAwKSB7CisJCQlwcmludGYgKCIlczogUmVjZWl2ZWQgJWQgYnl0ZSBQYWNrZXQgQCAweCV4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJcGt0X2luZm8uYnVmX3B0cik7CisJCX0KKyNlbmRpZgorCQkvKiBVcGRhdGUgc3RhdGlzdGljcy4gTm90ZSBieXRlIGNvdW50IGluY2x1ZGVzIDQgYnl0ZSBDUkMgY291bnQgKi8KKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9pbmZvLmJ5dGVfY250OworCisJCS8qCisJCSAqIEluIGNhc2UgcmVjZWl2ZWQgYSBwYWNrZXQgd2l0aG91dCBmaXJzdCAvIGxhc3QgYml0cyBvbiBPUiB0aGUgZXJyb3IKKwkJICogc3VtbWFyeSBiaXQgaXMgb24sIHRoZSBwYWNrZXRzIG5lZWRzIHRvIGJlIGRyb3BlZWQuCisJCSAqLworCQlpZiAoKChwa3RfaW5mby4KKwkJICAgICAgY21kX3N0cyAmIChFVEhfUlhfRklSU1RfREVTQyB8IEVUSF9SWF9MQVNUX0RFU0MpKSAhPQorCQkgICAgIChFVEhfUlhfRklSU1RfREVTQyB8IEVUSF9SWF9MQVNUX0RFU0MpKQorCQkgICAgfHwgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfRVJST1JfU1VNTUFSWSkpIHsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisKKwkJCXByaW50ZiAoIlJlY2VpdmVkIHBhY2tldCBzcHJlYWQgb24gbXVsdGlwbGUgZGVzY3JpcHRvcnNcbiIpOworCisJCQkvKiBJcyB0aGlzIGNhdXNlZCBieSBhbiBlcnJvciA/ICovCisJCQlpZiAocGt0X2luZm8uY21kX3N0cyAmIEVUSF9FUlJPUl9TVU1NQVJZKSB7CisJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQkJfQorCisJCQkvKiBmcmVlIHRoZXNlIGRlc2NyaXB0b3JzIGFnYWluIHdpdGhvdXQgZm9yd2FyZGluZyB0aGVtIHRvIHRoZSBoaWdoZXIgbGF5ZXJzICovCisJCQlwa3RfaW5mby5idWZfcHRyICY9IH4weDc7CS8qIHJlYWxpZ24gYnVmZmVyIGFnYWluICovCisJCQlwa3RfaW5mby5ieXRlX2NudCA9IDB4MDAwMDsJLyogUmVzZXQgQnl0ZSBjb3VudCAqLworCisJCQlpZiAoZXRoX3J4X3JldHVybl9idWZmCisJCQkgICAgKGV0aGVybmV0X3ByaXZhdGUsIEVUSF9RMCwgJnBrdF9pbmZvKSAhPSBFVEhfT0spIHsKKwkJCQlwcmludGYgKCJFcnJvciB3aGlsZSByZXR1cm5pbmcgdGhlIFJYIERlc2MgdG8gUmluZ1xuIik7CisJCQl9IGVsc2UgeworCQkJCURQIChwcmludGYgKCJSWCBEZXNjIHJldHVybmVkIHRvIFJpbmdcbiIpKTsKKwkJCX0KKwkJCS8qIC9mcmVlIHRoZXNlIGRlc2NyaXB0b3JzIGFnYWluICovCisJCX0gZWxzZSB7CisKKy8qICEhISBjYWxsIGhpZ2hlciBsYXllciBwcm9jZXNzaW5nICovCisjaWZkZWYgREVCVUdfTVZfRVRICisJCQlwcmludGYgKCJcbk5vdyBzZW5kIGl0IHRvIHVwcGVyIGxheWVyIHByb3RvY29scyAoTmV0UmVjZWl2ZSkgLi4uXG4iKTsKKyNlbmRpZgorCQkJLyogbGV0IHRoZSB1cHBlciBsYXllciBoYW5kbGUgdGhlIHBhY2tldCAqLworCQkJTmV0UmVjZWl2ZSAoKHVjaGFyICopIHBrdF9pbmZvLmJ1Zl9wdHIsCisJCQkJICAgIChpbnQpIHBrdF9pbmZvLmJ5dGVfY250KTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogZnJlZSBkZXNjcmlwdG9yICAqLworCQkJcGt0X2luZm8uYnVmX3B0ciAmPSB+MHg3OwkvKiByZWFsaWduIGJ1ZmZlciBhZ2FpbiAqLworCQkJcGt0X2luZm8uYnl0ZV9jbnQgPSAweDAwMDA7CS8qIFJlc2V0IEJ5dGUgY291bnQgKi8KKwkJCURQIChwcmludGYKKwkJCSAgICAoIlJYOiBwa3RfaW5mby5idWZfcHRyID0JJXhcbiIsCisJCQkgICAgIHBrdF9pbmZvLmJ1Zl9wdHIpKTsKKwkJCWlmIChldGhfcnhfcmV0dXJuX2J1ZmYKKwkJCSAgICAoZXRoZXJuZXRfcHJpdmF0ZSwgRVRIX1EwLCAmcGt0X2luZm8pICE9IEVUSF9PSykgeworCQkJCXByaW50ZiAoIkVycm9yIHdoaWxlIHJldHVybmluZyB0aGUgUlggRGVzYyB0byBSaW5nXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJRFAgKHByaW50ZiAoIlJYIERlc2MgcmV0dXJuZWQgdG8gUmluZ1xuIikpOworCQkJfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKwkJfQorCX0KKwltdjY0MzYwX2V0aF9nZXRfc3RhdHMgKGRldik7CS8qIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdjY0MzYwX2V0aF9nZXRfc3RhdHMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKgorICogSW5wdXQgOiBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZQorICoKKyAqIE91dHB1dCA6IGEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlJ3Mgc3RhdGlzdGljcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbXY2NDM2MF9ldGhfZ2V0X3N0YXRzIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisJbXY2NDM2MF9ldGhfdXBkYXRlX3N0YXQgKGRldik7CisKKwlyZXR1cm4gcG9ydF9wcml2YXRlLT5zdGF0czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfdXBkYXRlX3N0YXQKKyAqCisgKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKgorICogSW5wdXQgOiBwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6IE4vQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG12NjQzNjBfZXRoX3VwZGF0ZV9zdGF0IChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQzNjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBkdW1teTsKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisJc3RhdHMgPSBwb3J0X3ByaXZhdGUtPnN0YXRzOworCisJLyogVGhlc2UgYXJlIGZhbHNlIHVwZGF0ZXMgKi8KKwlzdGF0cy0+cnhfcGFja2V0cyArPSAodW5zaWduZWQgbG9uZykKKwkJZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtLAorCQkJCSAgICAgIEVUSF9NSUJfR09PRF9GUkFNRVNfUkVDRUlWRUQpOworCXN0YXRzLT50eF9wYWNrZXRzICs9ICh1bnNpZ25lZCBsb25nKQorCQlldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9HT09EX0ZSQU1FU19TRU5UKTsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gKHVuc2lnbmVkIGxvbmcpCisJCWV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSwKKwkJCQkgICAgICBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0xPVyk7CisJLyoKKwkgKiBJZGVhbGx5IHRoaXMgc2hvdWxkIGJlIGFzIGZvbGxvd3MgLQorCSAqCisJICogICBzdGF0cy0+cnhfYnl0ZXMgICArPSBzdGF0cy0+cnhfYnl0ZXMgKworCSAqICgodW5zaWduZWQgbG9uZykgZXRoUmVhZE1pYkNvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtICwKKwkgKiBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0hJR0gpIDw8IDMyKTsKKwkgKgorCSAqIEJ1dCB0aGUgdW5zaWduZWQgbG9uZyBpbiBQb3dlclBDIGFuZCBNSVBTIGFyZSAzMmJpdC4gU28gdGhlIG5leHQgcmVhZAorCSAqIGlzIGp1c3QgYSBkdW1teSByZWFkIGZvciBwcm9wZXIgd29yayBvZiB0aGUgR2lnRSBwb3J0CisJICovCisJZHVtbXkgPSBldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdIKTsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gKHVuc2lnbmVkIGxvbmcpCisJCWV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSwKKwkJCQkgICAgICBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfTE9XKTsKKwlkdW1teSA9IGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSwKKwkJCQkgICAgICBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfSElHSCk7CisJc3RhdHMtPnJ4X2Vycm9ycyArPSAodW5zaWduZWQgbG9uZykKKwkJZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtLAorCQkJCSAgICAgIEVUSF9NSUJfTUFDX1JFQ0VJVkVfRVJST1IpOworCisJLyogUnggZHJvcHBlZCBpcyBmb3IgcmVjZWl2ZWQgcGFja2V0IHdpdGggQ1JDIGVycm9yICovCisJc3RhdHMtPnJ4X2Ryb3BwZWQgKz0KKwkJKHVuc2lnbmVkIGxvbmcpIGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT4KKwkJCQkJCSAgICAgIHBvcnRfbnVtLAorCQkJCQkJICAgICAgRVRIX01JQl9CQURfQ1JDX0VWRU5UKTsKKwlzdGF0cy0+bXVsdGljYXN0ICs9ICh1bnNpZ25lZCBsb25nKQorCQlldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9NVUxUSUNBU1RfRlJBTUVTX1JFQ0VJVkVEKTsKKwlzdGF0cy0+Y29sbGlzaW9ucyArPQorCQkodW5zaWduZWQgbG9uZykgZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPgorCQkJCQkJICAgICAgcG9ydF9udW0sCisJCQkJCQkgICAgICBFVEhfTUlCX0NPTExJU0lPTikgKworCQkodW5zaWduZWQgbG9uZykgZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPgorCQkJCQkJICAgICAgcG9ydF9udW0sCisJCQkJCQkgICAgICBFVEhfTUlCX0xBVEVfQ09MTElTSU9OKTsKKwkvKiBkZXRhaWxlZCByeCBlcnJvcnMgKi8KKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPQorCQkodW5zaWduZWQgbG9uZykgZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPgorCQkJCQkJICAgICAgcG9ydF9udW0sCisJCQkJCQkgICAgICBFVEhfTUlCX1VOREVSU0laRV9SRUNFSVZFRCkKKwkJKworCQkodW5zaWduZWQgbG9uZykgZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPgorCQkJCQkJICAgICAgcG9ydF9udW0sCisJCQkJCQkgICAgICBFVEhfTUlCX09WRVJTSVpFX1JFQ0VJVkVEKTsKKwkvKiBkZXRhaWxlZCB0eCBlcnJvcnMgKi8KK30KKworI2lmbmRlZiAgVVBEQVRFX1NUQVRTX0JZX1NPRlRXQVJFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDM2MF9ldGhfcHJpbnRfc3RhdAorICoKKyAqIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgaW4gdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnB1dCA6IHBvaW50ZXIgdG8gZXRoZXJuZXQgaW50ZXJmYWNlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogT3V0cHV0IDogTi9BCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbXY2NDM2MF9ldGhfcHJpbnRfc3RhdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0MzYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisJc3RhdHMgPSBwb3J0X3ByaXZhdGUtPnN0YXRzOworCisJLyogVGhlc2UgYXJlIGZhbHNlIHVwZGF0ZXMgKi8KKwlwcmludGYgKCJcbiMjIyBOZXR3b3JrIHN0YXRpc3RpY3M6ICMjI1xuIik7CisJcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ZiAoIiBQYWNrZXRzIHJlY2VpdmVkOgkJJWxkXG4iLCBzdGF0cy0+cnhfcGFja2V0cyk7CisJcHJpbnRmICgiIFBhY2tldHMgc2VuZDoJCQklbGRcbiIsIHN0YXRzLT50eF9wYWNrZXRzKTsKKwlwcmludGYgKCIgUmVjZWl2ZWQgYnl0ZXM6CQklbGRcbiIsIHN0YXRzLT5yeF9ieXRlcyk7CisJcHJpbnRmICgiIFNlbmQgYnl0ZXM6CQkJJWxkXG4iLCBzdGF0cy0+dHhfYnl0ZXMpOworCWlmIChzdGF0cy0+cnhfZXJyb3JzICE9IDApCisJCXByaW50ZiAoIiBSeCBFcnJvcnM6CQkJJWxkXG4iLAorCQkJc3RhdHMtPnJ4X2Vycm9ycyk7CisJaWYgKHN0YXRzLT5yeF9kcm9wcGVkICE9IDApCisJCXByaW50ZiAoIiBSeCBkcm9wcGVkIChDUkMgRXJyb3JzKToJJWxkXG4iLAorCQkJc3RhdHMtPnJ4X2Ryb3BwZWQpOworCWlmIChzdGF0cy0+bXVsdGljYXN0ICE9IDApCisJCXByaW50ZiAoIiBSeCBtdWxpY2FzdCBmcmFtZXM6CQklbGRcbiIsCisJCQlzdGF0cy0+bXVsdGljYXN0KTsKKwlpZiAoc3RhdHMtPmNvbGxpc2lvbnMgIT0gMCkKKwkJcHJpbnRmICgiIE5vLiBvZiBjb2xsaXNpb25zOgkJJWxkXG4iLAorCQkJc3RhdHMtPmNvbGxpc2lvbnMpOworCWlmIChzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyAhPSAwKQorCQlwcmludGYgKCIgUnggbGVuZ3RoIGVycm9yczoJCSVsZFxuIiwKKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqbmV0d29ya19zdGFydCAtIE5ldHdvcmsgS2ljayBPZmYgUm91dGluZSBVQm9vdAorICpJbnB1dHMgOgorICpPdXRwdXRzIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYm9vbCBkYjY0MzYwX2V0aF9zdGFydCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKG12NjQzNjBfZXRoX29wZW4gKGRldikpOwkvKiBjYWxscyByZWFsIG9wZW4gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLiAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBiYXNlZCBvbiBMaW51eCBjb2RlCisgKiBhcmNoL3BwYy9nYWxpbGVvL0VWQjY0MzYwL212NjQzNjBfZXRoLmMgLSBEcml2ZXIgZm9yIE1WNjQzNjBYIGV0aGVybmV0IHBvcnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgcmFiZWVoQGdhbGlsZW8uY28uaWwKKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYXJ2ZWxsJ3MgR2lnYWJpdCBFdGhlcm5ldCBjb250cm9sbGVyIGxvdyBsZXZlbCBkcml2ZXIKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgZmlsZSBpbnRyb2R1Y2UgbG93IGxldmVsIEFQSSB0byBNYXJ2ZWxsJ3MgR2lnYWJpdCBFdGhlcm5ldAorICoJCWNvbnRyb2xsZXIuIFRoaXMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyIGRyaXZlciBBUEkgY29udHJvbHMKKyAqCQkxKSBPcGVyYXRpb25zIChpLmUuIHBvcnQgaW5pdCwgc3RhcnQsIHJlc2V0IGV0YycpLgorICoJCTIpIERhdGEgZmxvdyAoaS5lLiBwb3J0IHNlbmQsIHJlY2VpdmUgZXRjJykuCisgKgkJRWFjaCBHaWdhYml0IEV0aGVybmV0IHBvcnQgaXMgY29udHJvbGxlZCB2aWEgRVRIX1BPUlRfSU5GTworICoJCXN0cnVjdC4KKyAqCQlUaGlzIHN0cnVjdCBpbmNsdWRlcyB1c2VyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgd2VsbCBhcworICoJCWRyaXZlciBpbnRlcm5hbCBkYXRhIG5lZWRlZCBmb3IgaXRzIG9wZXJhdGlvbnMuCisgKgorICoJCVN1cHBvcnRlZCBGZWF0dXJlczoKKyAqCQktIFRoaXMgbG93IGxldmVsIGRyaXZlciBpcyBPUyBpbmRlcGVuZGVudC4gQWxsb2NhdGluZyBtZW1vcnkgZm9yCisgKgkJICB0aGUgZGVzY3JpcHRvciByaW5ncyBhbmQgYnVmZmVycyBhcmUgbm90IHdpdGhpbiB0aGUgc2NvcGUgb2YKKyAqCQkgIHRoaXMgZHJpdmVyLgorICoJCS0gVGhlIHVzZXIgaXMgZnJlZSBmcm9tIFJ4L1R4IHF1ZXVlIG1hbmFnaW5nLgorICoJCS0gVGhpcyBsb3cgbGV2ZWwgZHJpdmVyIGludHJvZHVjZSBmdW5jdGlvbmFsaXR5IEFQSSB0aGF0IGVuYWJsZQorICoJCSAgdGhlIHRvIG9wZXJhdGUgTWFydmVsbCdzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciBpbiBhCisgKgkJICBjb252ZW5pZW50IHdheS4KKyAqCQktIFNpbXBsZSBHaWdhYml0IEV0aGVybmV0IHBvcnQgb3BlcmF0aW9uIEFQSS4KKyAqCQktIFNpbXBsZSBHaWdhYml0IEV0aGVybmV0IHBvcnQgZGF0YSBmbG93IEFQSS4KKyAqCQktIERhdGEgZmxvdyBhbmQgb3BlcmF0aW9uIEFQSSBzdXBwb3J0IHBlciBxdWV1ZSBmdW5jdGlvbmFsaXR5LgorICoJCS0gU3VwcG9ydCBjYWNoZWQgZGVzY3JpcHRvcnMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KKyAqCQktIEVuYWJsZSBhY2Nlc3MgdG8gYWxsIGZvdXIgRFJBTSBiYW5rcyBhbmQgaW50ZXJuYWwgU1JBTSBtZW1vcnkKKyAqCQkgIHNwYWNlcy4KKyAqCQktIFBIWSBhY2Nlc3MgYW5kIGNvbnRyb2wgQVBJLgorICoJCS0gUG9ydCBjb250cm9sIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gQVBJLgorICoJCS0gRnVsbCBjb250cm9sIG92ZXIgVW5pY2FzdCBhbmQgTXVsdGljYXN0IE1BQyBjb25maWd1cmF0aW9ucy4KKyAqCisgKgkJT3BlcmF0aW9uIGZsb3c6CisgKgorICoJCUluaXRpYWxpemF0aW9uIHBoYXNlCisgKgkJVGhpcyBwaGFzZSBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIEVUSF9QT1JUX0lORk8KKyAqCQlzdHJ1Y3QuCisgKgkJVXNlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcG9ydCBjb25maWd1cmF0aW9uIGhhcyB0byBiZSBzZXQKKyAqCQlwcmlvciB0byBjYWxsaW5nIHRoZSBwb3J0IGluaXRpYWxpemF0aW9uIHJvdXRpbmUuIEZvciBleGFtcGxlLAorICoJCXRoZSB1c2VyIGhhcyB0byBhc3NpZ24gdGhlIHBvcnRfcGh5X2FkZHIgZmllbGQgd2hpY2ggaXMgYm9hcmQKKyAqCQlkZXBlbmRlZCBwYXJhbWV0ZXIuCisgKgkJSW4gdGhpcyBwaGFzZSBhbnkgcG9ydCBUeC9SeCBhY3Rpdml0eSBpcyBoYWx0ZWQsIE1JQiBjb3VudGVycworICoJCWFyZSBjbGVhcmVkLCBQSFkgYWRkcmVzcyBpcyBzZXQgYWNjb3JkaW5nIHRvIHVzZXIgcGFyYW1ldGVyIGFuZAorICoJCWFjY2VzcyB0byBEUkFNIGFuZCBpbnRlcm5hbCBTUkFNIG1lbW9yeSBzcGFjZXMuCisgKgorICoJCURyaXZlciByaW5nIGluaXRpYWxpemF0aW9uCisgKgkJQWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGFuZCBidWZmZXJzIGlzIG5vdAorICoJCXdpdGhpbiB0aGUgc2NvcGUgb2YgdGhpcyBkcml2ZXIuIFRodXMsIHRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvCisgKgkJYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvcnMgcmluZyBhbmQgYnVmZmVycy4gVGhvc2UKKyAqCQltZW1vcnkgcGFyYW1ldGVycyBhcmUgdXNlZCBieSB0aGUgUnggYW5kIFR4IHJpbmcgaW5pdGlhbGl6YXRpb24KKyAqCQlyb3V0aW5lcyBpbiBvcmRlciB0byBjdXJ2ZSB0aGUgZGVzY3JpcHRvciBsaW5rZWQgbGlzdCBpbiBhIGZvcm0KKyAqCQlvZiBhIHJpbmcuCisgKgkJTm90ZTogUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIGFsaWdubWVudCBpc3N1ZXMgd2hlbiB1c2luZworICoJCWNhY2hlZCBkZXNjcmlwdG9ycy9idWZmZXJzLiBJbiB0aGlzIHBoYXNlIHRoZSBkcml2ZXIgc3RvcmUKKyAqCQlpbmZvcm1hdGlvbiBpbiB0aGUgRVRIX1BPUlRfSU5GTyBzdHJ1Y3QgcmVnYXJkaW5nIGVhY2ggcXVldWUKKyAqCQlyaW5nLgorICoKKyAqCQlEcml2ZXIgc3RhcnQKKyAqCQlUaGlzIHBoYXNlIHByZXBhcmVzIHRoZSBFdGhlcm5ldCBwb3J0IGZvciBSeCBhbmQgVHggYWN0aXZpdHkuCisgKgkJSXQgdXNlcyB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBFVEhfUE9SVF9JTkZPIHN0cnVjdCB0bworICoJCWluaXRpYWxpemUgdGhlIHZhcmlvdXMgcG9ydCByZWdpc3RlcnMuCisgKgorICoJCURhdGEgZmxvdzoKKyAqCQlBbGwgcGFja2V0IHJlZmVyZW5jZXMgdG8vZnJvbSB0aGUgZHJpdmVyIGFyZSBkb25lIHVzaW5nIFBLVF9JTkZPCisgKgkJc3RydWN0LgorICoJCVRoaXMgc3RydWN0IGlzIGEgdW5pZmllZCBzdHJ1Y3QgdXNlZCB3aXRoIFJ4IGFuZCBUeCBvcGVyYXRpb25zLgorICoJCVRoaXMgd2F5IHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmYW1pbGlhciB3aXRoIG5laXRoZXIKKyAqCQlUeCBub3IgUnggZGVzY3JpcHRvcnMgc3RydWN0dXJlcy4KKyAqCQlUaGUgZHJpdmVyJ3MgZGVzY3JpcHRvcnMgcmluZ3MgYXJlIG1hbmFnZW1lbnQgYnkgaW5kZXhlcy4KKyAqCQlUaG9zZSBpbmRleGVzIGNvbnRyb2xzIHRoZSByaW5nIHJlc291cmNlcyBhbmQgdXNlZCB0byBpbmRpY2F0ZQorICoJCWEgU1cgcmVzb3VyY2UgZXJyb3I6CisgKgkJJ2N1cnJlbnQnCisgKgkJVGhpcyBpbmRleCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYXZhaWxhYmxlIHJlc291cmNlIGZvciB1c2UuIEZvcgorICoJCWV4YW1wbGUgaW4gUnggcHJvY2VzcyB0aGlzIGluZGV4IHdpbGwgcG9pbnQgdG8gdGhlIGRlc2NyaXB0b3IKKyAqCQl0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB1c2VyIHVwb24gY2FsbGluZyB0aGUgcmVjZWl2ZSByb3V0aW5lLgorICoJCUluIFR4IHByb2Nlc3MsIHRoaXMgaW5kZXggd2lsbCBwb2ludCB0byB0aGUgZGVzY3JpcHRvcgorICoJCXRoYXQgd2lsbCBiZSBhc3NpZ25lZCB3aXRoIHRoZSB1c2VyIHBhY2tldCBpbmZvIGFuZCB0cmFuc21pdHRlZC4KKyAqCQkndXNlZCcKKyAqCQlUaGlzIGluZGV4IHBvaW50cyB0byB0aGUgZGVzY3JpcHRvciB0aGF0IG5lZWQgdG8gcmVzdG9yZSBpdHMKKyAqCQlyZXNvdXJjZXMuIEZvciBleGFtcGxlIGluIFJ4IHByb2Nlc3MsIHVzaW5nIHRoZSBSeCBidWZmZXIgcmV0dXJuCisgKgkJQVBJIHdpbGwgYXR0YWNoIHRoZSBidWZmZXIgcmV0dXJuZWQgaW4gcGFja2V0IGluZm8gdG8gdGhlCisgKgkJZGVzY3JpcHRvciBwb2ludGVkIGJ5ICd1c2VkJy4gSW4gVHggcHJvY2VzcywgdXNpbmcgdGhlIFR4CisgKgkJZGVzY3JpcHRvciByZXR1cm4gd2lsbCBtZXJlbHkgcmV0dXJuIHRoZSB1c2VyIHBhY2tldCBpbmZvIHdpdGgKKyAqCQl0aGUgY29tbWFuZCBzdGF0dXMgb2YgIHRoZSB0cmFuc21pdHRlZCBidWZmZXIgcG9pbnRlZCBieSB0aGUKKyAqCQkndXNlZCcgaW5kZXguIE5ldmVydGhlbGVzcywgaXQgaXMgZXNzZW50aWFsIHRvIHVzZSB0aGlzIHJvdXRpbmUKKyAqCQl0byB1cGRhdGUgdGhlICd1c2VkJyBpbmRleC4KKyAqCQknZmlyc3QnCisgKgkJVGhpcyBpbmRleCBzdXBwb3J0cyBUeCBTY2F0dGVyLUdhdGhlci4gSXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICoJCWRlc2NyaXB0b3Igb2YgYSBwYWNrZXQgYXNzZW1ibGVkIG9mIG11bHRpcGxlIGJ1ZmZlcnMuIEZvciBleGFtcGxlCisgKgkJd2hlbiBpbiBtaWRkbGUgb2YgU3VjaCBwYWNrZXQgd2UgaGF2ZSBhIFR4IHJlc291cmNlIGVycm9yIHRoZQorICoJCSdjdXJyJyBpbmRleCBnZXQgdGhlIHZhbHVlIG9mICdmaXJzdCcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmluZworICoJCXJldHVybmVkIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdHJ5aW5nIHRvIHRyYW5zbWl0IHRoaXMgcGFja2V0LgorICoKKyAqCQlSZWNlaXZlIG9wZXJhdGlvbjoKKyAqCQlUaGUgZXRoX3BvcnRfcmVjZWl2ZSBBUEkgc2V0IHRoZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0LAorICoJCXBhc3NlZCBieSB0aGUgY2FsbGVyLCB3aXRoIHJlY2VpdmVkIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKgkJJ2N1cnJlbnQnIFNETUEgZGVzY3JpcHRvci4KKyAqCQlJdCBpcyB0aGUgdXNlciByZXNwb25zaWJpbGl0eSB0byByZXR1cm4gdGhpcyByZXNvdXJjZSBiYWNrCisgKgkJdG8gdGhlIFJ4IGRlc2NyaXB0b3IgcmluZyB0byBlbmFibGUgdGhlIHJldXNlIG9mIHRoaXMgc291cmNlLgorICoJCVJldHVybiBSeCByZXNvdXJjZSBpcyBkb25lIHVzaW5nIHRoZSBldGhfcnhfcmV0dXJuX2J1ZmYgQVBJLgorICoKKyAqCQlUcmFuc21pdCBvcGVyYXRpb246CisgKgkJVGhlIGV0aF9wb3J0X3NlbmQgQVBJIHN1cHBvcnRzIFNjYXR0ZXItR2F0aGVyIHdoaWNoIGVuYWJsZXMgdG8KKyAqCQlzZW5kIGEgcGFja2V0IHNwYW5uZWQgb3ZlciBtdWx0aXBsZSBidWZmZXJzLiBUaGlzIG1lYW5zIHRoYXQKKyAqCQlmb3IgZWFjaCBwYWNrZXQgaW5mbyBzdHJ1Y3R1cmUgZ2l2ZW4gYnkgdGhlIHVzZXIgYW5kIHB1dCBpbnRvCisgKgkJdGhlIFR4IGRlc2NyaXB0b3JzIHJpbmcsIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25seSBpZiB0aGUgJ0xBU1QnCisgKgkJYml0IHdpbGwgYmUgc2V0IGluIHRoZSBwYWNrZXQgaW5mbyBjb21tYW5kIHN0YXR1cyBmaWVsZC4gVGhpcworICoJCUFQSSBhbHNvIGNvbnNpZGVyIHJlc3RyaWN0aW9uIHJlZ2FyZGluZyBidWZmZXIgYWxpZ25tZW50cyBhbmQKKyAqCQlzaXplcy4KKyAqCQlUaGUgdXNlciBtdXN0IHJldHVybiBhIFR4IHJlc291cmNlIGFmdGVyIGVuc3VyaW5nIHRoZSBidWZmZXIKKyAqCQloYXMgYmVlbiB0cmFuc21pdHRlZCB0byBlbmFibGUgdGhlIFR4IHJpbmcgaW5kZXhlcyB0byB1cGRhdGUuCisgKgorICoJCUJPQVJEIExBWU9VVAorICoJCVRoaXMgZGV2aWNlIGlzIG9uLWJvYXJkLiAgTm8ganVtcGVyIGRpYWdyYW0gaXMgbmVjZXNzYXJ5LgorICoKKyAqCQlFWFRFUk5BTCBJTlRFUkZBQ0UKKyAqCisgKiAgICAgICBQcmlvciB0byBjYWxsaW5nIHRoZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGV0aF9wb3J0X2luaXQoKSB0aGUgdXNlcgorICoJIG11c3Qgc2V0IHRoZSBmb2xsb3dpbmcgZmllbGRzIHVuZGVyIEVUSF9QT1JUX0lORk8gc3RydWN0OgorICogICAgICAgcG9ydF9udW0gICAgICAgICAgICAgVXNlciBFdGhlcm5ldCBwb3J0IG51bWJlci4KKyAqICAgICAgIHBvcnRfcGh5X2FkZHIJCSAgICBVc2VyIFBIWSBhZGRyZXNzIG9mIEV0aGVybmV0IHBvcnQuCisgKiAgICAgICBwb3J0X21hY19hZGRyWzZdCSAgICBVc2VyIGRlZmluZWQgcG9ydCBNQUMgYWRkcmVzcy4KKyAqICAgICAgIHBvcnRfY29uZmlnICAgICAgICAgIFVzZXIgcG9ydCBjb25maWd1cmF0aW9uIHZhbHVlLgorICogICAgICAgcG9ydF9jb25maWdfZXh0ZW5kICAgIFVzZXIgcG9ydCBjb25maWcgZXh0ZW5kIHZhbHVlLgorICogICAgICAgcG9ydF9zZG1hX2NvbmZpZyAgICAgIFVzZXIgcG9ydCBTRE1BIGNvbmZpZyB2YWx1ZS4KKyAqICAgICAgIHBvcnRfc2VyaWFsX2NvbnRyb2wgICBVc2VyIHBvcnQgc2VyaWFsIGNvbnRyb2wgdmFsdWUuCisgKiAgICAgICAqcG9ydF92aXJ0X3RvX3BoeXMgKCkgIFVzZXIgZnVuY3Rpb24gdG8gY2FzdCB2aXJ0dWFsIGFkZHIgdG8gQ1BVIGJ1cyBhZGRyLgorICogICAgICAgKnBvcnRfcHJpdmF0ZSAgICAgICAgVXNlciBzY3JhdGNoIHBhZCBmb3IgdXNlciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMuCisgKgorICogICAgICAgVGhpcyBkcml2ZXIgaW50cm9kdWNlIGEgc2V0IG9mIGRlZmF1bHQgdmFsdWVzOgorICogICAgICAgUE9SVF9DT05GSUdfVkFMVUUgICAgICAgICAgIERlZmF1bHQgcG9ydCBjb25maWd1cmF0aW9uIHZhbHVlCisgKiAgICAgICBQT1JUX0NPTkZJR19FWFRFTkRfVkFMVUUgICAgRGVmYXVsdCBwb3J0IGV4dGVuZCBjb25maWd1cmF0aW9uIHZhbHVlCisgKiAgICAgICBQT1JUX1NETUFfQ09ORklHX1ZBTFVFICAgICAgRGVmYXVsdCBzZG1hIGNvbnRyb2wgdmFsdWUKKyAqICAgICAgIFBPUlRfU0VSSUFMX0NPTlRST0xfVkFMVUUgICBEZWZhdWx0IHBvcnQgc2VyaWFsIGNvbnRyb2wgdmFsdWUKKyAqCisgKgkJVGhpcyBkcml2ZXIgZGF0YSBmbG93IGlzIGRvbmUgdXNpbmcgdGhlIFBLVF9JTkZPIHN0cnVjdCB3aGljaCBpcworICoJCWEgdW5pZmllZCBzdHJ1Y3QgZm9yIFJ4IGFuZCBUeCBvcGVyYXRpb25zOgorICoJCWJ5dGVfY250CVR4L1J4IGRlc2NyaXB0b3IgYnVmZmVyIGJ5dGUgY291bnQuCisgKgkJbDRpX2NoawkJQ1BVIHByb3ZpZGVkIFRDUCBDaGVja3N1bS4gRm9yIFR4IG9wZXJhdGlvbiBvbmx5LgorICoJCWNtZF9zdHMJCVR4L1J4IGRlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMuCisgKgkJYnVmX3B0cgkJVHgvUnggZGVzY3JpcHRvciBidWZmZXIgcG9pbnRlci4KKyAqCQlyZXR1cm5faW5mbwlUeC9SeCB1c2VyIHJlc291cmNlIHJldHVybiBpbmZvcm1hdGlvbi4KKyAqCisgKgorICoJCUVYVEVSTkFMIFNVUFBPUlQgUkVRVUlSRU1FTlRTCisgKgorICoJCVRoaXMgZHJpdmVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgc3VwcG9ydDoKKyAqCisgKgkJRF9DQUNIRV9GTFVTSF9MSU5FIChhZGRyZXNzLCBhZGRyZXNzIG9mZnNldCkKKyAqCisgKgkJVGhpcyBtYWNybyBhcHBsaWVzIGFzc2VtYmx5IGNvZGUgdG8gZmx1c2ggYW5kIGludmFsaWRhdGUgY2FjaGUKKyAqCQlsaW5lLgorICoJCWFkZHJlc3MgICAgICAgIC0gYWRkcmVzcyBiYXNlLgorICoJCWFkZHJlc3Mgb2Zmc2V0IC0gYWRkcmVzcyBvZmZzZXQKKyAqCisgKgorICoJCUNQVV9QSVBFX0ZMVVNICisgKgorICoJCVRoaXMgbWFjcm8gYXBwbGllcyBhc3NlbWJseSBjb2RlIHRvIGZsdXNoIHRoZSBDUFUgcGlwZWxpbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpbmNsdWRlcyAqLworCisvKiBkZWZpbmVzICovCisvKiBTRE1BIGNvbW1hbmQgbWFjcm9zICovCisjZGVmaW5lIEVUSF9FTkFCTEVfVFhfUVVFVUUodHhfcXVldWUsIGV0aF9wb3J0KSBcCisgTVZfUkVHX1dSSVRFKE1WNjQzNjBfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKGV0aF9wb3J0KSwgKDEgPDwgdHhfcXVldWUpKQorCisjZGVmaW5lIEVUSF9ESVNBQkxFX1RYX1FVRVVFKHR4X3F1ZXVlLCBldGhfcG9ydCkgXAorIE1WX1JFR19XUklURShNVjY0MzYwX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhldGhfcG9ydCksXAorICgxIDw8ICg4ICsgdHhfcXVldWUpKSkKKworI2RlZmluZSBFVEhfRU5BQkxFX1JYX1FVRVVFKHJ4X3F1ZXVlLCBldGhfcG9ydCkgXAorTVZfUkVHX1dSSVRFKE1WNjQzNjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcoZXRoX3BvcnQpLCAoMSA8PCByeF9xdWV1ZSkpCisKKyNkZWZpbmUgRVRIX0RJU0FCTEVfUlhfUVVFVUUocnhfcXVldWUsIGV0aF9wb3J0KSBcCitNVl9SRUdfV1JJVEUoTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhldGhfcG9ydCksICgxIDw8ICg4ICsgcnhfcXVldWUpKSkKKworI2RlZmluZSBDVVJSX1JGRF9HRVQocF9jdXJyX2Rlc2MsIHF1ZXVlKSBcCisgKChwX2N1cnJfZGVzYykgPSBwX2V0aF9wb3J0X2N0cmwtPnBfcnhfY3Vycl9kZXNjX3FbcXVldWVdKQorCisjZGVmaW5lIENVUlJfUkZEX1NFVChwX2N1cnJfZGVzYywgcXVldWUpIFwKKyAocF9ldGhfcG9ydF9jdHJsLT5wX3J4X2N1cnJfZGVzY19xW3F1ZXVlXSA9IChwX2N1cnJfZGVzYykpCisKKyNkZWZpbmUgVVNFRF9SRkRfR0VUKHBfdXNlZF9kZXNjLCBxdWV1ZSkgXAorICgocF91c2VkX2Rlc2MpID0gcF9ldGhfcG9ydF9jdHJsLT5wX3J4X3VzZWRfZGVzY19xW3F1ZXVlXSkKKworI2RlZmluZSBVU0VEX1JGRF9TRVQocF91c2VkX2Rlc2MsIHF1ZXVlKVwKKyhwX2V0aF9wb3J0X2N0cmwtPnBfcnhfdXNlZF9kZXNjX3FbcXVldWVdID0gKHBfdXNlZF9kZXNjKSkKKworCisjZGVmaW5lIENVUlJfVEZEX0dFVChwX2N1cnJfZGVzYywgcXVldWUpIFwKKyAoKHBfY3Vycl9kZXNjKSA9IHBfZXRoX3BvcnRfY3RybC0+cF90eF9jdXJyX2Rlc2NfcVtxdWV1ZV0pCisKKyNkZWZpbmUgQ1VSUl9URkRfU0VUKHBfY3Vycl9kZXNjLCBxdWV1ZSkgXAorIChwX2V0aF9wb3J0X2N0cmwtPnBfdHhfY3Vycl9kZXNjX3FbcXVldWVdID0gKHBfY3Vycl9kZXNjKSkKKworI2RlZmluZSBVU0VEX1RGRF9HRVQocF91c2VkX2Rlc2MsIHF1ZXVlKSBcCisgKChwX3VzZWRfZGVzYykgPSBwX2V0aF9wb3J0X2N0cmwtPnBfdHhfdXNlZF9kZXNjX3FbcXVldWVdKQorCisjZGVmaW5lIFVTRURfVEZEX1NFVChwX3VzZWRfZGVzYywgcXVldWUpIFwKKyAocF9ldGhfcG9ydF9jdHJsLT5wX3R4X3VzZWRfZGVzY19xW3F1ZXVlXSA9IChwX3VzZWRfZGVzYykpCisKKyNkZWZpbmUgRklSU1RfVEZEX0dFVChwX2ZpcnN0X2Rlc2MsIHF1ZXVlKSBcCisgKChwX2ZpcnN0X2Rlc2MpID0gcF9ldGhfcG9ydF9jdHJsLT5wX3R4X2ZpcnN0X2Rlc2NfcVtxdWV1ZV0pCisKKyNkZWZpbmUgRklSU1RfVEZEX1NFVChwX2ZpcnN0X2Rlc2MsIHF1ZXVlKSBcCisgKHBfZXRoX3BvcnRfY3RybC0+cF90eF9maXJzdF9kZXNjX3FbcXVldWVdID0gKHBfZmlyc3RfZGVzYykpCisKKworLyogTWFjcm9zIHRoYXQgc2F2ZSBhY2Nlc3MgdG8gZGVzYyBpbiBvcmRlciB0byBmaW5kIG5leHQgZGVzYyBwb2ludGVyICAqLworI2RlZmluZSBSWF9ORVhUX0RFU0NfUFRSKHBfcnhfZGVzYywgcXVldWUpIChFVEhfUlhfREVTQyopKCgoKCh1bnNpZ25lZCBpbnQpcF9yeF9kZXNjIC0gKHVuc2lnbmVkIGludClwX2V0aF9wb3J0X2N0cmwtPnBfcnhfZGVzY19hcmVhX2Jhc2VbcXVldWVdKSArIFJYX0RFU0NfQUxJR05FRF9TSVpFKSAlIHBfZXRoX3BvcnRfY3RybC0+cnhfZGVzY19hcmVhX3NpemVbcXVldWVdKSArICh1bnNpZ25lZCBpbnQpcF9ldGhfcG9ydF9jdHJsLT5wX3J4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSkKKworI2RlZmluZSBUWF9ORVhUX0RFU0NfUFRSKHBfdHhfZGVzYywgcXVldWUpIChFVEhfVFhfREVTQyopKCgoKCh1bnNpZ25lZCBpbnQpcF90eF9kZXNjIC0gKHVuc2lnbmVkIGludClwX2V0aF9wb3J0X2N0cmwtPnBfdHhfZGVzY19hcmVhX2Jhc2VbcXVldWVdKSArIFRYX0RFU0NfQUxJR05FRF9TSVpFKSAlIHBfZXRoX3BvcnRfY3RybC0+dHhfZGVzY19hcmVhX3NpemVbcXVldWVdKSArICh1bnNpZ25lZCBpbnQpcF9ldGhfcG9ydF9jdHJsLT5wX3R4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSkKKworI2RlZmluZSBMSU5LX1VQX1RJTUVPVVQJCTEwMDAwMAorI2RlZmluZSBQSFlfQlVTWV9USU1FT1VUICAgIDEwMDAwMDAwCisKKy8qIGxvY2FscyAqLworCisvKiBQSFkgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGV0aGVybmV0X3BoeV9zZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwgaW50IHBoeV9hZGRyKTsKK3N0YXRpYyBpbnQgZXRoZXJuZXRfcGh5X2dldCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtKTsKKworLyogRXRoZXJuZXQgUG9ydCByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgZXRoX3NldF9hY2Nlc3NfY29udHJvbCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgICBFVEhfV0lOX1BBUkFNICogcGFyYW0pOworc3RhdGljIGJvb2wgZXRoX3BvcnRfdWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLCB1bnNpZ25lZCBjaGFyIHVjX25pYmJsZSwKKwkJCSAgICAgIEVUSF9RVUVVRSBxdWV1ZSwgaW50IG9wdGlvbik7CisjaWYgMAkJCQkvKiBGSVhNRSAqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfc21jX2FkZHIgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIG1jX2J5dGUsCisJCQkgICAgICAgRVRIX1FVRVVFIHF1ZXVlLCBpbnQgb3B0aW9uKTsKK3N0YXRpYyBib29sIGV0aF9wb3J0X29tY19hZGRyIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBjcmM4LAorCQkJICAgICAgIEVUSF9RVUVVRSBxdWV1ZSwgaW50IG9wdGlvbik7CisjZW5kaWYKKworc3RhdGljIHZvaWQgZXRoX2JfY29weSAodW5zaWduZWQgaW50IHNyY19hZGRyLCB1bnNpZ25lZCBpbnQgZHN0X2FkZHIsCisJCQlpbnQgYnl0ZV9jb3VudCk7CisKK3ZvaWQgZXRoX2RiZyAoRVRIX1BPUlRfSU5GTyAqIHBfZXRoX3BvcnRfY3RybCk7CisKKwordHlwZWRlZiBlbnVtIF9tZW1vcnlfYmFuayB7IEJBTkswLCBCQU5LMSwgQkFOSzIsIEJBTkszIH0gTUVNT1JZX0JBTks7Cit1MzIgbXZfZ2V0X2RyYW1fYmFua19iYXNlX2FkZHIgKE1FTU9SWV9CQU5LIGJhbmspCit7CisJdTMyIHJlc3VsdCA9IDA7CisJdTMyIGVuYWJsZSA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0JBU0VfQUREUl9FTkFCTEUpOworCisJaWYgKGVuYWJsZSAmICgxIDw8IGJhbmspKQorCQlyZXR1cm4gMDsKKwlpZiAoYmFuayA9PSBCQU5LMCkKKwkJcmVzdWx0ID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfQ1NfMF9CQVNFX0FERFIpOworCWlmIChiYW5rID09IEJBTksxKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDM2MF9DU18xX0JBU0VfQUREUik7CisJaWYgKGJhbmsgPT0gQkFOSzIpCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0NTXzJfQkFTRV9BRERSKTsKKwlpZiAoYmFuayA9PSBCQU5LMykKKwkJcmVzdWx0ID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfQ1NfM19CQVNFX0FERFIpOworCXJlc3VsdCAmPSAweDAwMDBmZmZmOworCXJlc3VsdCA9IHJlc3VsdCA8PCAxNjsKKwlyZXR1cm4gcmVzdWx0OworfQorCit1MzIgbXZfZ2V0X2RyYW1fYmFua19zaXplIChNRU1PUllfQkFOSyBiYW5rKQoreworCXUzMiByZXN1bHQgPSAwOworCXUzMiBlbmFibGUgPSBNVl9SRUdfUkVBRCAoTVY2NDM2MF9CQVNFX0FERFJfRU5BQkxFKTsKKworCWlmIChlbmFibGUgJiAoMSA8PCBiYW5rKSkKKwkJcmV0dXJuIDA7CisJaWYgKGJhbmsgPT0gQkFOSzApCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0NTXzBfU0laRSk7CisJaWYgKGJhbmsgPT0gQkFOSzEpCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0NTXzFfU0laRSk7CisJaWYgKGJhbmsgPT0gQkFOSzIpCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0NTXzJfU0laRSk7CisJaWYgKGJhbmsgPT0gQkFOSzMpCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0NTXzNfU0laRSk7CisJcmVzdWx0ICs9IDE7CisJcmVzdWx0ICY9IDB4MDAwMGZmZmY7CisJcmVzdWx0ID0gcmVzdWx0IDw8IDE2OworCXJldHVybiByZXN1bHQ7Cit9CisKK3UzMiBtdl9nZXRfaW50ZXJuYWxfc3JhbV9iYXNlICh2b2lkKQoreworCXUzMiByZXN1bHQ7CisKKwlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDM2MF9JTlRFR1JBVEVEX1NSQU1fQkFTRV9BRERSKTsKKwlyZXN1bHQgJj0gMHgwMDAwZmZmZjsKKwlyZXN1bHQgPSByZXN1bHQgPDwgMTY7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3BvcnRfaW5pdCAtIEluaXRpYWxpemUgdGhlIEV0aGVybmV0IHBvcnQgZHJpdmVyCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBldGhlcm5ldCBwb3J0IHRvIHN0YXJ0IGl0cyBhY3Rpdml0eToKKyogICAgICAgMSkgQ29tcGxldGVzIHRoZSBldGhlcm5ldCBwb3J0IGRyaXZlciBzdHJ1Y3QgaW5pdGlhbGl6YXRpb24gdG93YXJkIHBvcnQKKyogICAgICAgICAgIHN0YXJ0IHJvdXRpbmUuCisqICAgICAgIDIpIFJlc2V0cyB0aGUgZGV2aWNlIHRvIGEgcXVpZXNjZW50IHN0YXRlIGluIGNhc2Ugb2Ygd2FybSByZWJvb3QuCisqICAgICAgIDMpIEVuYWJsZSBTRE1BIGFjY2VzcyB0byBhbGwgZm91ciBEUkFNIGJhbmtzIGFzIHdlbGwgYXMgaW50ZXJuYWwgU1JBTS4KKyogICAgICAgNCkgQ2xlYW4gTUFDIHRhYmxlcy4gVGhlIHJlc2V0IHN0YXR1cyBvZiB0aG9zZSB0YWJsZXMgaXMgdW5rbm93bi4KKyogICAgICAgNSkgU2V0IFBIWSBhZGRyZXNzLgorKiAgICAgICBOb3RlOiBDYWxsIHRoaXMgcm91dGluZSBwcmlvciB0byBldGhfcG9ydF9zdGFydCByb3V0aW5lIGFuZCBhZnRlciBzZXR0aW5nCisqICAgICAgIHVzZXIgdmFsdWVzIGluIHRoZSB1c2VyIGZpZWxkcyBvZiBFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0IChpLmUuCisqICAgICAgIHBvcnRfcGh5X2FkZHIpLgorKgorKiBJTlBVVDoKKyogICAgICAgRVRIX1BPUlRfSU5GTyAJKnBfZXRoX3BvcnRfY3RybCAgICAgICBFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0CisqCisqIE9VVFBVVDoKKyogICAgICAgU2VlIGRlc2NyaXB0aW9uLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfaW5pdCAoRVRIX1BPUlRfSU5GTyAqIHBfZXRoX3BvcnRfY3RybCkKK3sKKwlpbnQgcXVldWU7CisJRVRIX1dJTl9QQVJBTSB3aW5fcGFyYW07CisKKwlwX2V0aF9wb3J0X2N0cmwtPnBvcnRfY29uZmlnID0gUE9SVF9DT05GSUdfVkFMVUU7CisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X2NvbmZpZ19leHRlbmQgPSBQT1JUX0NPTkZJR19FWFRFTkRfVkFMVUU7CisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3NkbWFfY29uZmlnID0gUE9SVF9TRE1BX0NPTkZJR19WQUxVRTsKKwlwX2V0aF9wb3J0X2N0cmwtPnBvcnRfc2VyaWFsX2NvbnRyb2wgPSBQT1JUX1NFUklBTF9DT05UUk9MX1ZBTFVFOworCisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQgPSAwOworCXBfZXRoX3BvcnRfY3RybC0+cG9ydF90eF9xdWV1ZV9jb21tYW5kID0gMDsKKworCS8qIFplcm8gb3V0IFNXIHN0cnVjdHMgKi8KKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNQVhfUlhfUVVFVUVfTlVNOyBxdWV1ZSsrKSB7CisJCUNVUlJfUkZEX1NFVCAoKEVUSF9SWF9ERVNDICopIDB4MDAwMDAwMDAsIHF1ZXVlKTsKKwkJVVNFRF9SRkRfU0VUICgoRVRIX1JYX0RFU0MgKikgMHgwMDAwMDAwMCwgcXVldWUpOworCQlwX2V0aF9wb3J0X2N0cmwtPnJ4X3Jlc291cmNlX2VycltxdWV1ZV0gPSBmYWxzZTsKKwl9CisKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNQVhfVFhfUVVFVUVfTlVNOyBxdWV1ZSsrKSB7CisJCUNVUlJfVEZEX1NFVCAoKEVUSF9UWF9ERVNDICopIDB4MDAwMDAwMDAsIHF1ZXVlKTsKKwkJVVNFRF9URkRfU0VUICgoRVRIX1RYX0RFU0MgKikgMHgwMDAwMDAwMCwgcXVldWUpOworCQlGSVJTVF9URkRfU0VUICgoRVRIX1RYX0RFU0MgKikgMHgwMDAwMDAwMCwgcXVldWUpOworCQlwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2VycltxdWV1ZV0gPSBmYWxzZTsKKwl9CisKKwlldGhfcG9ydF9yZXNldCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSk7CisKKwkvKiBTZXQgYWNjZXNzIHBhcmFtZXRlcnMgZm9yIERSQU0gYmFuayAwICovCisJd2luX3BhcmFtLndpbiA9IEVUSF9XSU4wOwkvKiBVc2UgRXRoZXJuZXQgd2luZG93IDAgKi8KKwl3aW5fcGFyYW0udGFyZ2V0ID0gRVRIX1RBUkdFVF9EUkFNOwkvKiBXaW5kb3cgdGFyZ2V0IC0gRERSICAqLworCXdpbl9wYXJhbS5hdHRyaWJ1dGVzID0gRUJBUl9BVFRSX0RSQU1fQ1MwOwkvKiBFbmFibGUgRFJBTSBiYW5rICAgKi8KKyNpZm5kZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorCXdpbl9wYXJhbS5hdHRyaWJ1dGVzIHw9IEVCQVJfQVRUUl9EUkFNX0NBQ0hFX0NPSEVSRU5DWV9XQjsKKyNlbmRpZgorCXdpbl9wYXJhbS5oaWdoX2FkZHIgPSAwOworCS8qIEdldCBiYW5rIGJhc2UgKi8KKwl3aW5fcGFyYW0uYmFzZV9hZGRyID0gbXZfZ2V0X2RyYW1fYmFua19iYXNlX2FkZHIgKEJBTkswKTsKKwl3aW5fcGFyYW0uc2l6ZSA9IG12X2dldF9kcmFtX2Jhbmtfc2l6ZSAoQkFOSzApOwkvKiBHZXQgYmFuayBzaXplICovCisJaWYgKHdpbl9wYXJhbS5zaXplID09IDApCisJCXdpbl9wYXJhbS5lbmFibGUgPSAwOworCWVsc2UKKwkJd2luX3BhcmFtLmVuYWJsZSA9IDE7CS8qIEVuYWJsZSB0aGUgYWNjZXNzICovCisJd2luX3BhcmFtLmFjY2Vzc19jdHJsID0gRVdJTl9BQ0NFU1NfRlVMTDsJLyogRW5hYmxlIGZ1bGwgYWNjZXNzICovCisKKwkvKiBTZXQgdGhlIGFjY2VzcyBjb250cm9sIGZvciBhZGRyZXNzIHdpbmRvdyAoRVBBUFIpIFJFQUQgJiBXUklURSAqLworCWV0aF9zZXRfYWNjZXNzX2NvbnRyb2wgKHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0sICZ3aW5fcGFyYW0pOworCisJLyogU2V0IGFjY2VzcyBwYXJhbWV0ZXJzIGZvciBEUkFNIGJhbmsgMSAqLworCXdpbl9wYXJhbS53aW4gPSBFVEhfV0lOMTsJLyogVXNlIEV0aGVybmV0IHdpbmRvdyAxICovCisJd2luX3BhcmFtLnRhcmdldCA9IEVUSF9UQVJHRVRfRFJBTTsJLyogV2luZG93IHRhcmdldCAtIEREUiAqLworCXdpbl9wYXJhbS5hdHRyaWJ1dGVzID0gRUJBUl9BVFRSX0RSQU1fQ1MxOwkvKiBFbmFibGUgRFJBTSBiYW5rICovCisjaWZuZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKwl3aW5fcGFyYW0uYXR0cmlidXRlcyB8PSBFQkFSX0FUVFJfRFJBTV9DQUNIRV9DT0hFUkVOQ1lfV0I7CisjZW5kaWYKKwl3aW5fcGFyYW0uaGlnaF9hZGRyID0gMDsKKwkvKiBHZXQgYmFuayBiYXNlICovCisJd2luX3BhcmFtLmJhc2VfYWRkciA9IG12X2dldF9kcmFtX2JhbmtfYmFzZV9hZGRyIChCQU5LMSk7CisJd2luX3BhcmFtLnNpemUgPSBtdl9nZXRfZHJhbV9iYW5rX3NpemUgKEJBTksxKTsJLyogR2V0IGJhbmsgc2l6ZSAqLworCWlmICh3aW5fcGFyYW0uc2l6ZSA9PSAwKQorCQl3aW5fcGFyYW0uZW5hYmxlID0gMDsKKwllbHNlCisJCXdpbl9wYXJhbS5lbmFibGUgPSAxOwkvKiBFbmFibGUgdGhlIGFjY2VzcyAqLworCXdpbl9wYXJhbS5hY2Nlc3NfY3RybCA9IEVXSU5fQUNDRVNTX0ZVTEw7CS8qIEVuYWJsZSBmdWxsIGFjY2VzcyAqLworCisJLyogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBmb3IgYWRkcmVzcyB3aW5kb3cgKEVQQVBSKSBSRUFEICYgV1JJVEUgKi8KKwlldGhfc2V0X2FjY2Vzc19jb250cm9sIChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLCAmd2luX3BhcmFtKTsKKworCS8qIFNldCBhY2Nlc3MgcGFyYW1ldGVycyBmb3IgRFJBTSBiYW5rIDIgKi8KKwl3aW5fcGFyYW0ud2luID0gRVRIX1dJTjI7CS8qIFVzZSBFdGhlcm5ldCB3aW5kb3cgMiAqLworCXdpbl9wYXJhbS50YXJnZXQgPSBFVEhfVEFSR0VUX0RSQU07CS8qIFdpbmRvdyB0YXJnZXQgLSBERFIgKi8KKwl3aW5fcGFyYW0uYXR0cmlidXRlcyA9IEVCQVJfQVRUUl9EUkFNX0NTMjsJLyogRW5hYmxlIERSQU0gYmFuayAqLworI2lmbmRlZiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFCisJd2luX3BhcmFtLmF0dHJpYnV0ZXMgfD0gRUJBUl9BVFRSX0RSQU1fQ0FDSEVfQ09IRVJFTkNZX1dCOworI2VuZGlmCisJd2luX3BhcmFtLmhpZ2hfYWRkciA9IDA7CisJLyogR2V0IGJhbmsgYmFzZSAqLworCXdpbl9wYXJhbS5iYXNlX2FkZHIgPSBtdl9nZXRfZHJhbV9iYW5rX2Jhc2VfYWRkciAoQkFOSzIpOworCXdpbl9wYXJhbS5zaXplID0gbXZfZ2V0X2RyYW1fYmFua19zaXplIChCQU5LMik7CS8qIEdldCBiYW5rIHNpemUgKi8KKwlpZiAod2luX3BhcmFtLnNpemUgPT0gMCkKKwkJd2luX3BhcmFtLmVuYWJsZSA9IDA7CisJZWxzZQorCQl3aW5fcGFyYW0uZW5hYmxlID0gMTsJLyogRW5hYmxlIHRoZSBhY2Nlc3MgKi8KKwl3aW5fcGFyYW0uYWNjZXNzX2N0cmwgPSBFV0lOX0FDQ0VTU19GVUxMOwkvKiBFbmFibGUgZnVsbCBhY2Nlc3MgKi8KKworCS8qIFNldCB0aGUgYWNjZXNzIGNvbnRyb2wgZm9yIGFkZHJlc3Mgd2luZG93IChFUEFQUikgUkVBRCAmIFdSSVRFICovCisJZXRoX3NldF9hY2Nlc3NfY29udHJvbCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSwgJndpbl9wYXJhbSk7CisKKwkvKiBTZXQgYWNjZXNzIHBhcmFtZXRlcnMgZm9yIERSQU0gYmFuayAzICovCisJd2luX3BhcmFtLndpbiA9IEVUSF9XSU4zOwkvKiBVc2UgRXRoZXJuZXQgd2luZG93IDMgKi8KKwl3aW5fcGFyYW0udGFyZ2V0ID0gRVRIX1RBUkdFVF9EUkFNOwkvKiBXaW5kb3cgdGFyZ2V0IC0gRERSICovCisJd2luX3BhcmFtLmF0dHJpYnV0ZXMgPSBFQkFSX0FUVFJfRFJBTV9DUzM7CS8qIEVuYWJsZSBEUkFNIGJhbmsgKi8KKyNpZm5kZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorCXdpbl9wYXJhbS5hdHRyaWJ1dGVzIHw9IEVCQVJfQVRUUl9EUkFNX0NBQ0hFX0NPSEVSRU5DWV9XQjsKKyNlbmRpZgorCXdpbl9wYXJhbS5oaWdoX2FkZHIgPSAwOworCS8qIEdldCBiYW5rIGJhc2UgKi8KKwl3aW5fcGFyYW0uYmFzZV9hZGRyID0gbXZfZ2V0X2RyYW1fYmFua19iYXNlX2FkZHIgKEJBTkszKTsKKwl3aW5fcGFyYW0uc2l6ZSA9IG12X2dldF9kcmFtX2Jhbmtfc2l6ZSAoQkFOSzMpOwkvKiBHZXQgYmFuayBzaXplICovCisJaWYgKHdpbl9wYXJhbS5zaXplID09IDApCisJCXdpbl9wYXJhbS5lbmFibGUgPSAwOworCWVsc2UKKwkJd2luX3BhcmFtLmVuYWJsZSA9IDE7CS8qIEVuYWJsZSB0aGUgYWNjZXNzICovCisJd2luX3BhcmFtLmFjY2Vzc19jdHJsID0gRVdJTl9BQ0NFU1NfRlVMTDsJLyogRW5hYmxlIGZ1bGwgYWNjZXNzICovCisKKwkvKiBTZXQgdGhlIGFjY2VzcyBjb250cm9sIGZvciBhZGRyZXNzIHdpbmRvdyAoRVBBUFIpIFJFQUQgJiBXUklURSAqLworCWV0aF9zZXRfYWNjZXNzX2NvbnRyb2wgKHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0sICZ3aW5fcGFyYW0pOworCisJLyogU2V0IGFjY2VzcyBwYXJhbWV0ZXJzIGZvciBJbnRlcm5hbCBTUkFNICovCisJd2luX3BhcmFtLndpbiA9IEVUSF9XSU40OwkvKiBVc2UgRXRoZXJuZXQgd2luZG93IDAgKi8KKwl3aW5fcGFyYW0udGFyZ2V0ID0gRUJBUl9UQVJHRVRfQ0JTOwkvKiBUYXJnZXQgLSBJbnRlcm5hbCBTUkFNICovCisJd2luX3BhcmFtLmF0dHJpYnV0ZXMgPSBFQkFSX0FUVFJfQ0JTX1NSQU0gfCBFQkFSX0FUVFJfQ0JTX1NSQU1fQkxPQ0swOworCXdpbl9wYXJhbS5oaWdoX2FkZHIgPSAwOworCXdpbl9wYXJhbS5iYXNlX2FkZHIgPSBtdl9nZXRfaW50ZXJuYWxfc3JhbV9iYXNlICgpOwkvKiBHZXQgYmFzZSBhZGRyICovCisJd2luX3BhcmFtLnNpemUgPSBNVjY0MzYwX0lOVEVSTkFMX1NSQU1fU0laRTsJLyogR2V0IGJhbmsgc2l6ZSAqLworCXdpbl9wYXJhbS5lbmFibGUgPSAxOwkvKiBFbmFibGUgdGhlIGFjY2VzcyAqLworCXdpbl9wYXJhbS5hY2Nlc3NfY3RybCA9IEVXSU5fQUNDRVNTX0ZVTEw7CS8qIEVuYWJsZSBmdWxsIGFjY2VzcyAqLworCisJLyogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBmb3IgYWRkcmVzcyB3aW5kb3cgKEVQQVBSKSBSRUFEICYgV1JJVEUgKi8KKwlldGhfc2V0X2FjY2Vzc19jb250cm9sIChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLCAmd2luX3BhcmFtKTsKKworCWV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSk7CisKKwlldGhlcm5ldF9waHlfc2V0IChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLAorCQkJICBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfcGh5X2FkZHIpOworCisJcmV0dXJuOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X3N0YXJ0IC0gU3RhcnQgdGhlIEV0aGVybmV0IHBvcnQgYWN0aXZpdHkuCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcHJlcGFyZXMgdGhlIEV0aGVybmV0IHBvcnQgZm9yIFJ4IGFuZCBUeCBhY3Rpdml0eToKKyogICAgICAgMS4gSW5pdGlhbGl6ZSBUeCBhbmQgUnggQ3VycmVudCBEZXNjcmlwdG9yIFBvaW50ZXIgZm9yIGVhY2ggcXVldWUgdGhhdAorKiAgICAgICAgICAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYSBkZXNjcmlwdG9yJ3MgcmluZyAodXNpbmcgZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcKKyogICAgICAgICAgIGZvciBUeCBhbmQgZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgZm9yIFJ4KQorKiAgICAgICAyLiBJbml0aWFsaXplIGFuZCBlbmFibGUgdGhlIEV0aGVybmV0IGNvbmZpZ3VyYXRpb24gcG9ydCBieSB3cml0aW5nIHRvCisqICAgICAgICAgICB0aGUgcG9ydCdzIGNvbmZpZ3VyYXRpb24gYW5kIGNvbW1hbmQgcmVnaXN0ZXJzLgorKiAgICAgICAzLiBJbml0aWFsaXplIGFuZCBlbmFibGUgdGhlIFNETUEgYnkgd3JpdGluZyB0byB0aGUgU0RNQSdzCisqICAgIGNvbmZpZ3VyYXRpb24gYW5kIGNvbW1hbmQgcmVnaXN0ZXJzLgorKiAgICAgICBBZnRlciBjb21wbGV0aW5nIHRoZXNlIHN0ZXBzLCB0aGUgZXRoZXJuZXQgcG9ydCBTRE1BIGNhbiBzdGFydHMgdG8KKyogICAgICAgcGVyZm9ybSBSeCBhbmQgVHggYWN0aXZpdGllcy4KKyoKKyogICAgICAgTm90ZTogRWFjaCBSeCBhbmQgVHggcXVldWUgZGVzY3JpcHRvcidzIGxpc3QgbXVzdCBiZSBpbml0aWFsaXplZCBwcmlvcgorKiAgICAgICB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHVzZSBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyBmb3IgVHggcXVldWVzIGFuZAorKiAgICAgICBldGhlcl9pbml0X3J4X2Rlc2NfcmluZyBmb3IgUnggcXVldWVzKS4KKyoKKyogSU5QVVQ6CisqICAgICAgIEVUSF9QT1JUX0lORk8gCSpwX2V0aF9wb3J0X2N0cmwgICAgICAgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdAorKgorKiBPVVRQVVQ6CisqICAgICAgIEV0aGVybmV0IHBvcnQgaXMgcmVhZHkgdG8gcmVjZWl2ZSBhbmQgdHJhbnNtaXQuCisqCisqIFJFVFVSTjoKKyogICAgICAgZmFsc2UgaWYgdGhlIHBvcnQgUEhZIGlzIG5vdCB1cC4KKyogICAgICAgdHJ1ZSBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfc3RhcnQgKEVUSF9QT1JUX0lORk8gKiBwX2V0aF9wb3J0X2N0cmwpCit7CisJaW50IHF1ZXVlOworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2N1cnJfZGVzYzsKKwl2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF9yeF9jdXJyX2Rlc2M7CisJdW5zaWduZWQgaW50IHBoeV9yZWdfZGF0YTsKKwlFVEhfUE9SVCBldGhfcG9ydF9udW0gPSBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtOworCisKKwkvKiBBc3NpZ25tZW50IG9mIFR4IENUUlAgb2YgZ2l2ZW4gcXVldWUgKi8KKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNQVhfVFhfUVVFVUVfTlVNOyBxdWV1ZSsrKSB7CisJCUNVUlJfVEZEX0dFVCAocF90eF9jdXJyX2Rlc2MsIHF1ZXVlKTsKKwkJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wCisJCQkgICAgICAgKGV0aF9wb3J0X251bSkKKwkJCSAgICAgICArICg0ICogcXVldWUpKSwKKwkJCSAgICAgICgodW5zaWduZWQgaW50KSBwX3R4X2N1cnJfZGVzYykpOworCisJfQorCisJLyogQXNzaWdubWVudCBvZiBSeCBDUkRQIG9mIGdpdmVuIHF1ZXVlICovCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTUFYX1JYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQlDVVJSX1JGRF9HRVQgKHBfcnhfY3Vycl9kZXNjLCBxdWV1ZSk7CisJCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMAorCQkJICAgICAgIChldGhfcG9ydF9udW0pCisJCQkgICAgICAgKyAoNCAqIHF1ZXVlKSksCisJCQkgICAgICAoKHVuc2lnbmVkIGludCkgcF9yeF9jdXJyX2Rlc2MpKTsKKworCQlpZiAocF9yeF9jdXJyX2Rlc2MgIT0gTlVMTCkKKwkJCS8qIEFkZCB0aGUgYXNzaWduZWQgRXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgcG9ydCdzIGFkZHJlc3MgdGFibGUgKi8KKwkJCWV0aF9wb3J0X3VjX2FkZHJfc2V0IChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLAorCQkJCQkgICAgICBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbWFjX2FkZHIsCisJCQkJCSAgICAgIHF1ZXVlKTsKKwl9CisKKwkvKiBBc3NpZ24gcG9ydCBjb25maWd1cmF0aW9uIGFuZCBjb21tYW5kLiAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUE9SVF9DT05GSUdfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfY29uZmlnKTsKKworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X2NvbmZpZ19leHRlbmQpOworCisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3NlcmlhbF9jb250cm9sKTsKKworCU1WX1NFVF9SRUdfQklUUyAoTVY2NDM2MF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcgKGV0aF9wb3J0X251bSksCisJCQkgRVRIX1NFUklBTF9QT1JUX0VOQUJMRSk7CisKKwkvKiBBc3NpZ24gcG9ydCBTRE1BIGNvbmZpZ3VyYXRpb24gKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1NETUFfQ09ORklHX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3NkbWFfY29uZmlnKTsKKworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfVFhfUVVFVUVfMF9UT0tFTl9CVUNLRVRfQ09VTlQKKwkJICAgICAgKGV0aF9wb3J0X251bSksIDB4M2ZmZmZmZmYpOworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfVFhfUVVFVUVfMF9UT0tFTl9CVUNLRVRfQ09ORklHCisJCSAgICAgIChldGhfcG9ydF9udW0pLCAweDAzZmZmY2ZmKTsKKwkvKiBUdXJuIG9mZiB0aGUgcG9ydC9xdWV1ZSBiYW5kd2lkdGggbGltaXRhdGlvbiAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfTUFYSU1VTV9UUkFOU01JVF9VTklUIChldGhfcG9ydF9udW0pLCAweDApOworCisJLyogRW5hYmxlIHBvcnQgUnguICovCisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfcnhfcXVldWVfY29tbWFuZCk7CisKKwkvKiBDaGVjayBpZiBsaW5rIGlzIHVwICovCisJZXRoX3BvcnRfcmVhZF9zbWlfcmVnIChldGhfcG9ydF9udW0sIDEsICZwaHlfcmVnX2RhdGEpOworCisJaWYgKCEocGh5X3JlZ19kYXRhICYgMHgyMCkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfcG9ydF91Y19hZGRyX3NldCAtIFRoaXMgZnVuY3Rpb24gU2V0IHRoZSBwb3J0IFVuaWNhc3QgYWRkcmVzcy4KKyoKKyogREVTQ1JJUFRJT046CisqCQlUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCBFdGhlcm5ldCBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVQ6CisqCUVUSF9QT1JUIGV0aF9wb3J0X251bSAgICAgUG9ydCBudW1iZXIuCisqCWNoYXIgKiAgICAgICAgcF9hZGRyCQlBZGRyZXNzIHRvIGJlIHNldAorKglFVEhfUVVFVUUgCSAgcXVldWUJCVJ4IHF1ZXVlIG51bWJlciBmb3IgdGhpcyBNQUMgYWRkcmVzcy4KKyoKKyogT1VUUFVUOgorKglTZXQgTUFDIGFkZHJlc3MgbG93IGFuZCBoaWdoIHJlZ2lzdGVycy4gYWxzbyBjYWxscyBldGhfcG9ydF91Y19hZGRyKCkKKyogICAgICAgVG8gc2V0IHRoZSB1bmljYXN0IHRhYmxlIHdpdGggdGhlIHByb3BlciBpbmZvcm1hdGlvbi4KKyoKKyogUkVUVVJOOgorKglOL0EuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfdWNfYWRkcl9zZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnBfYWRkciwgRVRIX1FVRVVFIHF1ZXVlKQoreworCXVuc2lnbmVkIGludCBtYWNfaDsKKwl1bnNpZ25lZCBpbnQgbWFjX2w7CisKKwltYWNfbCA9IChwX2FkZHJbNF0gPDwgOCkgfCAocF9hZGRyWzVdKTsKKwltYWNfaCA9IChwX2FkZHJbMF0gPDwgMjQpIHwgKHBfYWRkclsxXSA8PCAxNikgfAorCQkocF9hZGRyWzJdIDw8IDgpIHwgKHBfYWRkclszXSA8PCAwKTsKKworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfTUFDX0FERFJfTE9XIChldGhfcG9ydF9udW0pLCBtYWNfbCk7CisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9NQUNfQUREUl9ISUdIIChldGhfcG9ydF9udW0pLCBtYWNfaCk7CisKKwkvKiBBY2NlcHQgZnJhbWVzIG9mIHRoaXMgYWRkcmVzcyAqLworCWV0aF9wb3J0X3VjX2FkZHIgKGV0aF9wb3J0X251bSwgcF9hZGRyWzVdLCBxdWV1ZSwgQUNDRVBUX01BQ19BRERSKTsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3BvcnRfdWNfYWRkciAtIFRoaXMgZnVuY3Rpb24gU2V0IHRoZSBwb3J0IHVuaWNhc3QgYWRkcmVzcyB0YWJsZQorKgorKiBERVNDUklQVElPTjoKKyoJVGhpcyBmdW5jdGlvbiBsb2NhdGVzIHRoZSBwcm9wZXIgZW50cnkgaW4gdGhlIFVuaWNhc3QgdGFibGUgZm9yIHRoZQorKglzcGVjaWZpZWQgTUFDIG5pYmJsZSBhbmQgc2V0cyBpdHMgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gZnVuY3Rpb24KKyoJcGFyYW1ldGVycy4KKyoKKyogSU5QVVQ6CisqCUVUSF9QT1JUIAlldGhfcG9ydF9udW0gICAgICBQb3J0IG51bWJlci4KKyoJdW5zaWduZWQgY2hhciB1Y19uaWJibGUJCVVuaWNhc3QgTUFDIEFkZHJlc3MgbGFzdCBuaWJibGUuCisqCUVUSF9RVUVVRSAJCSBxdWV1ZQkJUnggcXVldWUgbnVtYmVyIGZvciB0aGlzIE1BQyBhZGRyZXNzLgorKglpbnQgCQkJb3B0aW9uICAgICAgMCA9IEFkZCwgMSA9IHJlbW92ZSBhZGRyZXNzLgorKgorKiBPVVRQVVQ6CisqCVRoaXMgZnVuY3Rpb24gYWRkL3JlbW92ZXMgTUFDIGFkZHJlc3NlcyBmcm9tIHRoZSBwb3J0IHVuaWNhc3QgYWRkcmVzcworKgl0YWJsZS4KKyoKKyogUkVUVVJOOgorKgl0cnVlIGlzIG91dHB1dCBzdWNjZWVkZWQuCisqCWZhbHNlIGlmIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhfcG9ydF91Y19hZGRyIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkgICAgICB1bnNpZ25lZCBjaGFyIHVjX25pYmJsZSwKKwkJCSAgICAgIEVUSF9RVUVVRSBxdWV1ZSwgaW50IG9wdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgdW5pY2FzdF9yZWc7CisJdW5zaWduZWQgaW50IHRibF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisKKwkvKiBMb2NhdGUgdGhlIFVuaWNhc3QgdGFibGUgZW50cnkgKi8KKwl1Y19uaWJibGUgPSAoMHhmICYgdWNfbmliYmxlKTsKKwl0Ymxfb2Zmc2V0ID0gKHVjX25pYmJsZSAvIDQpICogNDsJLyogUmVnaXN0ZXIgb2Zmc2V0IGZyb20gdW5pY2FzdCB0YWJsZSBiYXNlICovCisJcmVnX29mZnNldCA9IHVjX25pYmJsZSAlIDQ7CS8qIEVudHJ5IG9mZnNldCB3aXRoaW4gdGhlIGFib3ZlIHJlZ2lzdGVyICovCisKKwlzd2l0Y2ggKG9wdGlvbikgeworCWNhc2UgUkVKRUNUX01BQ19BRERSOgorCQkvKiBDbGVhciBhY2NlcHRzIGZyYW1lIGJpdCBhdCBzcGVjaWZpZWQgdW5pY2FzdCBEQSB0YWJsZSBlbnRyeSAqLworCQl1bmljYXN0X3JlZyA9CisJCQlNVl9SRUdfUkVBRCAoKE1WNjQzNjBfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCQkgICAgICAoZXRoX3BvcnRfbnVtKQorCQkJCSAgICAgICsgdGJsX29mZnNldCkpOworCisJCXVuaWNhc3RfcmVnICY9ICgweDBFIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCSAgICAgICAoZXRoX3BvcnRfbnVtKQorCQkJICAgICAgICsgdGJsX29mZnNldCksIHVuaWNhc3RfcmVnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDQ0VQVF9NQUNfQUREUjoKKwkJLyogU2V0IGFjY2VwdHMgZnJhbWUgYml0IGF0IHVuaWNhc3QgREEgZmlsdGVyIHRhYmxlIGVudHJ5ICovCisJCXVuaWNhc3RfcmVnID0KKwkJCU1WX1JFR19SRUFEICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJCSAgICAgIChldGhfcG9ydF9udW0pCisJCQkJICAgICAgKyB0Ymxfb2Zmc2V0KSk7CisKKwkJdW5pY2FzdF9yZWcgfD0gKCgweDAxIHwgcXVldWUpIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCSAgICAgICAoZXRoX3BvcnRfbnVtKQorCQkJICAgICAgICsgdGJsX29mZnNldCksIHVuaWNhc3RfcmVnKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKyNpZiAwCQkJCS8qIEZJWE1FICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfcG9ydF9tY19hZGRyIC0gTXVsdGljYXN0IGFkZHJlc3Mgc2V0dGluZ3MuCisqCisqIERFU0NSSVBUSU9OOgorKglUaGlzIEFQSSBjb250cm9scyB0aGUgTVYgZGV2aWNlIE1BQyBtdWx0aWNhc3Qgc3VwcG9ydC4KKyoJVGhlIE1WIGRldmljZSBzdXBwb3J0cyBtdWx0aWNhc3QgdXNpbmcgdHdvIHRhYmxlczoKKyoJMSkgU3BlY2lhbCBNdWx0aWNhc3QgVGFibGUgZm9yIE1BQyBhZGRyZXNzZXMgb2YgdGhlIGZvcm0KKyoJICAgMHgwMS0wMC01RS0wMC0wMC1YWCAod2hlcmUgWFggaXMgYmV0d2VlbiAweDAwIGFuZCAweF9mRikuCisqCSAgIFRoZSBNQUMgREFbNzowXSBiaXRzIGFyZSB1c2VkIGFzIGEgcG9pbnRlciB0byB0aGUgU3BlY2lhbCBNdWx0aWNhc3QKKyoJICAgVGFibGUgZW50cmllcyBpbiB0aGUgREEtRmlsdGVyIHRhYmxlLgorKgkgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbiBjYWxscyBldGhfcG9ydF9zbWNfYWRkcigpIHJvdXRpbmUgdG8gc2V0IHRoZQorKgkgICBTcGVjaWFsIE11bHRpY2FzdCBUYWJsZS4KKyoJMikgT3RoZXIgTXVsdGljYXN0IFRhYmxlIGZvciBtdWx0aWNhc3Qgb2YgYW5vdGhlciB0eXBlLiBBIENSQy04Yml0CisqCSAgIGlzIHVzZWQgYXMgYW4gaW5kZXggdG8gdGhlIE90aGVyIE11bHRpY2FzdCBUYWJsZSBlbnRyaWVzIGluIHRoZQorKgkgICBEQS1GaWx0ZXIgdGFibGUuCisqCSAgIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIENSQy04Yml0IHZhbHVlIGFuZCBjYWxscworKgkgICBldGhfcG9ydF9vbWNfYWRkcigpIHJvdXRpbmUgdG8gc2V0IHRoZSBPdGhlciBNdWx0aWNhc3QgVGFibGUuCisqIElOUFVUOgorKglFVEhfUE9SVCAJZXRoX3BvcnRfbnVtICAgICAgUG9ydCBudW1iZXIuCisqCXVuc2lnbmVkIGNoYXIgCSpwX2FkZHIJCVVuaWNhc3QgTUFDIEFkZHJlc3MuCisqCUVUSF9RVUVVRSAJCSBxdWV1ZQkJUnggcXVldWUgbnVtYmVyIGZvciB0aGlzIE1BQyBhZGRyZXNzLgorKglpbnQgCQkJb3B0aW9uICAgICAgMCA9IEFkZCwgMSA9IHJlbW92ZSBhZGRyZXNzLgorKgorKiBPVVRQVVQ6CisqCVNlZSBkZXNjcmlwdGlvbi4KKyoKKyogUkVUVVJOOgorKgl0cnVlIGlzIG91dHB1dCBzdWNjZWVkZWQuCisqCWZhbHNlIGlmIGFkZF9hZGRyZXNzX3RhYmxlX2VudHJ5KCApIGZhaWxlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9tY19hZGRyIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpwX2FkZHIsCisJCQkgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IG1hY19oOworCXVuc2lnbmVkIGludCBtYWNfbDsKKwl1bnNpZ25lZCBjaGFyIGNyY19yZXN1bHQgPSAwOworCWludCBtYWNfYXJyYXlbNDhdOworCWludCBjcmNbOF07CisJaW50IGk7CisKKworCWlmICgocF9hZGRyWzBdID09IDB4MDEpICYmCisJICAgIChwX2FkZHJbMV0gPT0gMHgwMCkgJiYKKwkgICAgKHBfYWRkclsyXSA9PSAweDVFKSAmJiAocF9hZGRyWzNdID09IDB4MDApICYmIChwX2FkZHJbNF0gPT0gMHgwMCkpCisKKwkJZXRoX3BvcnRfc21jX2FkZHIgKGV0aF9wb3J0X251bSwgcF9hZGRyWzVdLCBxdWV1ZSwgb3B0aW9uKTsKKwllbHNlIHsKKwkJLyogQ2FsY3VsYXRlIENSQy04IG91dCBvZiB0aGUgZ2l2ZW4gYWRkcmVzcyAqLworCQltYWNfaCA9IChwX2FkZHJbMF0gPDwgOCkgfCAocF9hZGRyWzFdKTsKKwkJbWFjX2wgPSAocF9hZGRyWzJdIDw8IDI0KSB8IChwX2FkZHJbM10gPDwgMTYpIHwKKwkJCShwX2FkZHJbNF0gPDwgOCkgfCAocF9hZGRyWzVdIDw8IDApOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJbWFjX2FycmF5W2ldID0gKG1hY19sID4+IGkpICYgMHgxOworCQlmb3IgKGkgPSAzMjsgaSA8IDQ4OyBpKyspCisJCQltYWNfYXJyYXlbaV0gPSAobWFjX2ggPj4gKGkgLSAzMikpICYgMHgxOworCisKKwkJY3JjWzBdID0gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0M10gXiBtYWNfYXJyYXlbNDBdIF4KKwkJCW1hY19hcnJheVszOV0gXiBtYWNfYXJyYXlbMzVdIF4gbWFjX2FycmF5WzM0XSBeCisJCQltYWNfYXJyYXlbMzFdIF4gbWFjX2FycmF5WzMwXSBeIG1hY19hcnJheVsyOF0gXgorCQkJbWFjX2FycmF5WzIzXSBeIG1hY19hcnJheVsyMV0gXiBtYWNfYXJyYXlbMTldIF4KKwkJCW1hY19hcnJheVsxOF0gXiBtYWNfYXJyYXlbMTZdIF4gbWFjX2FycmF5WzE0XSBeCisJCQltYWNfYXJyYXlbMTJdIF4gbWFjX2FycmF5WzhdIF4gbWFjX2FycmF5WzddIF4KKwkJCW1hY19hcnJheVs2XSBeIG1hY19hcnJheVswXTsKKworCQljcmNbMV0gPSBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0NF0gXgorCQkJbWFjX2FycmF5WzQzXSBeIG1hY19hcnJheVs0MV0gXiBtYWNfYXJyYXlbMzldIF4KKwkJCW1hY19hcnJheVszNl0gXiBtYWNfYXJyYXlbMzRdIF4gbWFjX2FycmF5WzMyXSBeCisJCQltYWNfYXJyYXlbMzBdIF4gbWFjX2FycmF5WzI5XSBeIG1hY19hcnJheVsyOF0gXgorCQkJbWFjX2FycmF5WzI0XSBeIG1hY19hcnJheVsyM10gXiBtYWNfYXJyYXlbMjJdIF4KKwkJCW1hY19hcnJheVsyMV0gXiBtYWNfYXJyYXlbMjBdIF4gbWFjX2FycmF5WzE4XSBeCisJCQltYWNfYXJyYXlbMTddIF4gbWFjX2FycmF5WzE2XSBeIG1hY19hcnJheVsxNV0gXgorCQkJbWFjX2FycmF5WzE0XSBeIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTJdIF4KKwkJCW1hY19hcnJheVs5XSBeIG1hY19hcnJheVs2XSBeIG1hY19hcnJheVsxXSBeCisJCQltYWNfYXJyYXlbMF07CisKKwkJY3JjWzJdID0gbWFjX2FycmF5WzQ3XSBeIG1hY19hcnJheVs0Nl0gXiBtYWNfYXJyYXlbNDRdIF4KKwkJCW1hY19hcnJheVs0M10gXiBtYWNfYXJyYXlbNDJdIF4gbWFjX2FycmF5WzM5XSBeCisJCQltYWNfYXJyYXlbMzddIF4gbWFjX2FycmF5WzM0XSBeIG1hY19hcnJheVszM10gXgorCQkJbWFjX2FycmF5WzI5XSBeIG1hY19hcnJheVsyOF0gXiBtYWNfYXJyYXlbMjVdIF4KKwkJCW1hY19hcnJheVsyNF0gXiBtYWNfYXJyYXlbMjJdIF4gbWFjX2FycmF5WzE3XSBeCisJCQltYWNfYXJyYXlbMTVdIF4gbWFjX2FycmF5WzEzXSBeIG1hY19hcnJheVsxMl0gXgorCQkJbWFjX2FycmF5WzEwXSBeIG1hY19hcnJheVs4XSBeIG1hY19hcnJheVs2XSBeCisJCQltYWNfYXJyYXlbMl0gXiBtYWNfYXJyYXlbMV0gXiBtYWNfYXJyYXlbMF07CisKKwkJY3JjWzNdID0gbWFjX2FycmF5WzQ3XSBeIG1hY19hcnJheVs0NV0gXiBtYWNfYXJyYXlbNDRdIF4KKwkJCW1hY19hcnJheVs0M10gXiBtYWNfYXJyYXlbNDBdIF4gbWFjX2FycmF5WzM4XSBeCisJCQltYWNfYXJyYXlbMzVdIF4gbWFjX2FycmF5WzM0XSBeIG1hY19hcnJheVszMF0gXgorCQkJbWFjX2FycmF5WzI5XSBeIG1hY19hcnJheVsyNl0gXiBtYWNfYXJyYXlbMjVdIF4KKwkJCW1hY19hcnJheVsyM10gXiBtYWNfYXJyYXlbMThdIF4gbWFjX2FycmF5WzE2XSBeCisJCQltYWNfYXJyYXlbMTRdIF4gbWFjX2FycmF5WzEzXSBeIG1hY19hcnJheVsxMV0gXgorCQkJbWFjX2FycmF5WzldIF4gbWFjX2FycmF5WzddIF4gbWFjX2FycmF5WzNdIF4KKwkJCW1hY19hcnJheVsyXSBeIG1hY19hcnJheVsxXTsKKworCQljcmNbNF0gPSBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ1XSBeIG1hY19hcnJheVs0NF0gXgorCQkJbWFjX2FycmF5WzQxXSBeIG1hY19hcnJheVszOV0gXiBtYWNfYXJyYXlbMzZdIF4KKwkJCW1hY19hcnJheVszNV0gXiBtYWNfYXJyYXlbMzFdIF4gbWFjX2FycmF5WzMwXSBeCisJCQltYWNfYXJyYXlbMjddIF4gbWFjX2FycmF5WzI2XSBeIG1hY19hcnJheVsyNF0gXgorCQkJbWFjX2FycmF5WzE5XSBeIG1hY19hcnJheVsxN10gXiBtYWNfYXJyYXlbMTVdIF4KKwkJCW1hY19hcnJheVsxNF0gXiBtYWNfYXJyYXlbMTJdIF4gbWFjX2FycmF5WzEwXSBeCisJCQltYWNfYXJyYXlbOF0gXiBtYWNfYXJyYXlbNF0gXiBtYWNfYXJyYXlbM10gXgorCQkJbWFjX2FycmF5WzJdOworCisJCWNyY1s1XSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ1XSBeCisJCQltYWNfYXJyYXlbNDJdIF4gbWFjX2FycmF5WzQwXSBeIG1hY19hcnJheVszN10gXgorCQkJbWFjX2FycmF5WzM2XSBeIG1hY19hcnJheVszMl0gXiBtYWNfYXJyYXlbMzFdIF4KKwkJCW1hY19hcnJheVsyOF0gXiBtYWNfYXJyYXlbMjddIF4gbWFjX2FycmF5WzI1XSBeCisJCQltYWNfYXJyYXlbMjBdIF4gbWFjX2FycmF5WzE4XSBeIG1hY19hcnJheVsxNl0gXgorCQkJbWFjX2FycmF5WzE1XSBeIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTFdIF4KKwkJCW1hY19hcnJheVs5XSBeIG1hY19hcnJheVs1XSBeIG1hY19hcnJheVs0XSBeCisJCQltYWNfYXJyYXlbM107CisKKwkJY3JjWzZdID0gbWFjX2FycmF5WzQ3XSBeIG1hY19hcnJheVs0Nl0gXiBtYWNfYXJyYXlbNDNdIF4KKwkJCW1hY19hcnJheVs0MV0gXiBtYWNfYXJyYXlbMzhdIF4gbWFjX2FycmF5WzM3XSBeCisJCQltYWNfYXJyYXlbMzNdIF4gbWFjX2FycmF5WzMyXSBeIG1hY19hcnJheVsyOV0gXgorCQkJbWFjX2FycmF5WzI4XSBeIG1hY19hcnJheVsyNl0gXiBtYWNfYXJyYXlbMjFdIF4KKwkJCW1hY19hcnJheVsxOV0gXiBtYWNfYXJyYXlbMTddIF4gbWFjX2FycmF5WzE2XSBeCisJCQltYWNfYXJyYXlbMTRdIF4gbWFjX2FycmF5WzEyXSBeIG1hY19hcnJheVsxMF0gXgorCQkJbWFjX2FycmF5WzZdIF4gbWFjX2FycmF5WzVdIF4gbWFjX2FycmF5WzRdOworCisJCWNyY1s3XSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDRdIF4gbWFjX2FycmF5WzQyXSBeCisJCQltYWNfYXJyYXlbMzldIF4gbWFjX2FycmF5WzM4XSBeIG1hY19hcnJheVszNF0gXgorCQkJbWFjX2FycmF5WzMzXSBeIG1hY19hcnJheVszMF0gXiBtYWNfYXJyYXlbMjldIF4KKwkJCW1hY19hcnJheVsyN10gXiBtYWNfYXJyYXlbMjJdIF4gbWFjX2FycmF5WzIwXSBeCisJCQltYWNfYXJyYXlbMThdIF4gbWFjX2FycmF5WzE3XSBeIG1hY19hcnJheVsxNV0gXgorCQkJbWFjX2FycmF5WzEzXSBeIG1hY19hcnJheVsxMV0gXiBtYWNfYXJyYXlbN10gXgorCQkJbWFjX2FycmF5WzZdIF4gbWFjX2FycmF5WzVdOworCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQljcmNfcmVzdWx0ID0gY3JjX3Jlc3VsdCB8IChjcmNbaV0gPDwgaSk7CisKKwkJZXRoX3BvcnRfb21jX2FkZHIgKGV0aF9wb3J0X251bSwgY3JjX3Jlc3VsdCwgcXVldWUsIG9wdGlvbik7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3BvcnRfc21jX2FkZHIgLSBTcGVjaWFsIE11bHRpY2FzdCBhZGRyZXNzIHNldHRpbmdzLgorKgorKiBERVNDUklQVElPTjoKKyoJVGhpcyByb3V0aW5lIGNvbnRyb2xzIHRoZSBNViBkZXZpY2Ugc3BlY2lhbCBNQUMgbXVsdGljYXN0IHN1cHBvcnQuCisqCVRoZSBTcGVjaWFsIE11bHRpY2FzdCBUYWJsZSBmb3IgTUFDIGFkZHJlc3NlcyBzdXBwb3J0cyBNQUMgb2YgdGhlIGZvcm0KKyoJMHgwMS0wMC01RS0wMC0wMC1YWCAod2hlcmUgWFggaXMgYmV0d2VlbiAweDAwIGFuZCAweF9mRikuCisqCVRoZSBNQUMgREFbNzowXSBiaXRzIGFyZSB1c2VkIGFzIGEgcG9pbnRlciB0byB0aGUgU3BlY2lhbCBNdWx0aWNhc3QKKyoJVGFibGUgZW50cmllcyBpbiB0aGUgREEtRmlsdGVyIHRhYmxlLgorKglUaGlzIGZ1bmN0aW9uIHNldCB0aGUgU3BlY2lhbCBNdWx0aWNhc3QgVGFibGUgYXBwcm9wcmlhdGUgZW50cnkKKyoJYWNjb3JkaW5nIHRvIHRoZSBhcmd1bWVudCBnaXZlbi4KKyoKKyogSU5QVVQ6CisqCUVUSF9QT1JUIAlldGhfcG9ydF9udW0gICAgICBQb3J0IG51bWJlci4KKyoJdW5zaWduZWQgY2hhciAJbWNfYnl0ZQkJTXVsdGljYXN0IGFkZHIgbGFzdCBieXRlIChNQUMgREFbNzowXSBiaXRzKS4KKyoJRVRIX1FVRVVFIAkJIHF1ZXVlCQlSeCBxdWV1ZSBudW1iZXIgZm9yIHRoaXMgTUFDIGFkZHJlc3MuCisqCWludCAJCQlvcHRpb24gICAgICAwID0gQWRkLCAxID0gcmVtb3ZlIGFkZHJlc3MuCisqCisqIE9VVFBVVDoKKyoJU2VlIGRlc2NyaXB0aW9uLgorKgorKiBSRVRVUk46CisqCXRydWUgaXMgb3V0cHV0IHN1Y2NlZWRlZC4KKyoJZmFsc2UgaWYgb3B0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIGV0aF9wb3J0X3NtY19hZGRyIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBtY19ieXRlLAorCQkJICAgICAgIEVUSF9RVUVVRSBxdWV1ZSwgaW50IG9wdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgc21jX3RhYmxlX3JlZzsKKwl1bnNpZ25lZCBpbnQgdGJsX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcmVnX29mZnNldDsKKworCS8qIExvY2F0ZSB0aGUgU01DIHRhYmxlIGVudHJ5ICovCisJdGJsX29mZnNldCA9IChtY19ieXRlIC8gNCkgKiA0OwkvKiBSZWdpc3RlciBvZmZzZXQgZnJvbSBTTUMgdGFibGUgYmFzZSAqLworCXJlZ19vZmZzZXQgPSBtY19ieXRlICUgNDsJLyogRW50cnkgb2Zmc2V0IHdpdGhpbiB0aGUgYWJvdmUgcmVnaXN0ZXIgKi8KKwlxdWV1ZSAmPSAweDc7CisKKwlzd2l0Y2ggKG9wdGlvbikgeworCWNhc2UgUkVKRUNUX01BQ19BRERSOgorCQkvKiBDbGVhciBhY2NlcHRzIGZyYW1lIGJpdCBhdCBzcGVjaWZpZWQgU3BlY2lhbCBEQSB0YWJsZSBlbnRyeSAqLworCQlzbWNfdGFibGVfcmVnID0KKwkJCU1WX1JFR19SRUFEICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisJCXNtY190YWJsZV9yZWcgJj0gKDB4MEUgPDwgKDggKiByZWdfb2Zmc2V0KSk7CisKKwkJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSwgc21jX3RhYmxlX3JlZyk7CisJCWJyZWFrOworCisJY2FzZSBBQ0NFUFRfTUFDX0FERFI6CisJCS8qIFNldCBhY2NlcHRzIGZyYW1lIGJpdCBhdCBzcGVjaWZpZWQgU3BlY2lhbCBEQSB0YWJsZSBlbnRyeSAqLworCQlzbWNfdGFibGVfcmVnID0KKwkJCU1WX1JFR19SRUFEICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisJCXNtY190YWJsZV9yZWcgfD0gKCgweDAxIHwgcXVldWUpIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCksIHNtY190YWJsZV9yZWcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X29tY19hZGRyIC0gTXVsdGljYXN0IGFkZHJlc3Mgc2V0dGluZ3MuCisqCisqIERFU0NSSVBUSU9OOgorKglUaGlzIHJvdXRpbmUgY29udHJvbHMgdGhlIE1WIGRldmljZSBPdGhlciBNQUMgbXVsdGljYXN0IHN1cHBvcnQuCisqCVRoZSBPdGhlciBNdWx0aWNhc3QgVGFibGUgaXMgdXNlZCBmb3IgbXVsdGljYXN0IG9mIGFub3RoZXIgdHlwZS4KKyoJQSBDUkMtOGJpdCBpcyB1c2VkIGFzIGFuIGluZGV4IHRvIHRoZSBPdGhlciBNdWx0aWNhc3QgVGFibGUgZW50cmllcworKglpbiB0aGUgREEtRmlsdGVyIHRhYmxlLgorKglUaGUgZnVuY3Rpb24gZ2V0cyB0aGUgQ1JDLThiaXQgdmFsdWUgZnJvbSB0aGUgY2FsbGluZyByb3V0aW5lIGFuZAorKiAgICAgIHNldCB0aGUgT3RoZXIgTXVsdGljYXN0IFRhYmxlIGFwcHJvcHJpYXRlIGVudHJ5IGFjY29yZGluZyB0byB0aGUKKyoJQ1JDLTggYXJndW1lbnQgZ2l2ZW4uCisqCisqIElOUFVUOgorKglFVEhfUE9SVCAJZXRoX3BvcnRfbnVtICAgICAgUG9ydCBudW1iZXIuCisqCXVuc2lnbmVkIGNoYXIgCSAgY3JjOAkJQSBDUkMtOGJpdCAoUG9seW5vbWlhbDogeF44K3heMit4XjErMSkuCisqCUVUSF9RVUVVRSAJCSBxdWV1ZQkJUnggcXVldWUgbnVtYmVyIGZvciB0aGlzIE1BQyBhZGRyZXNzLgorKglpbnQgCQkJb3B0aW9uICAgICAgMCA9IEFkZCwgMSA9IHJlbW92ZSBhZGRyZXNzLgorKgorKiBPVVRQVVQ6CisqCVNlZSBkZXNjcmlwdGlvbi4KKyoKKyogUkVUVVJOOgorKgl0cnVlIGlzIG91dHB1dCBzdWNjZWVkZWQuCisqCWZhbHNlIGlmIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhfcG9ydF9vbWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgY3JjOCwKKwkJCSAgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IG9tY190YWJsZV9yZWc7CisJdW5zaWduZWQgaW50IHRibF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisKKwkvKiBMb2NhdGUgdGhlIE9NQyB0YWJsZSBlbnRyeSAqLworCXRibF9vZmZzZXQgPSAoY3JjOCAvIDQpICogNDsJLyogUmVnaXN0ZXIgb2Zmc2V0IGZyb20gT01DIHRhYmxlIGJhc2UgKi8KKwlyZWdfb2Zmc2V0ID0gY3JjOCAlIDQ7CS8qIEVudHJ5IG9mZnNldCB3aXRoaW4gdGhlIGFib3ZlIHJlZ2lzdGVyICovCisJcXVldWUgJj0gMHg3OworCisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlIFJFSkVDVF9NQUNfQUREUjoKKwkJLyogQ2xlYXIgYWNjZXB0cyBmcmFtZSBiaXQgYXQgc3BlY2lmaWVkIE90aGVyIERBIHRhYmxlIGVudHJ5ICovCisJCW9tY190YWJsZV9yZWcgPQorCQkJTVZfUkVHX1JFQUQgKChNVjY0MzYwX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisJCW9tY190YWJsZV9yZWcgJj0gKDB4MEUgPDwgKDggKiByZWdfb2Zmc2V0KSk7CisKKwkJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCksIG9tY190YWJsZV9yZWcpOworCQlicmVhazsKKworCWNhc2UgQUNDRVBUX01BQ19BRERSOgorCQkvKiBTZXQgYWNjZXB0cyBmcmFtZSBiaXQgYXQgc3BlY2lmaWVkIE90aGVyIERBIHRhYmxlIGVudHJ5ICovCisJCW9tY190YWJsZV9yZWcgPQorCQkJTVZfUkVHX1JFQUQgKChNVjY0MzYwX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisJCW9tY190YWJsZV9yZWcgfD0gKCgweDAxIHwgcXVldWUpIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRSAoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpLCBvbWNfdGFibGVfcmVnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyAtIENsZWFyIGFsbCBlbnRyYW5jZSBpbiB0aGUgVUMsIFNNQyBhbmQgT01DIHRhYmxlcworKgorKiBERVNDUklQVElPTjoKKyogICAgICAgR28gdGhyb3VnaCBhbGwgdGhlIERBIGZpbHRlciB0YWJsZXMgKFVuaWNhc3QsIFNwZWNpYWwgTXVsdGljYXN0ICYgT3RoZXIKKyogICAgICAgTXVsdGljYXN0KSBhbmQgc2V0IGVhY2ggZW50cnkgdG8gMC4KKyoKKyogSU5QVVQ6CisqCUVUSF9QT1JUICAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBNdWx0aWNhc3QgYW5kIFVuaWNhc3QgcGFja2V0cyBhcmUgcmVqZWN0ZWQuCisqCisqIFJFVFVSTjoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0X21hY190YWJsZXMgKEVUSF9QT1JUIGV0aF9wb3J0X251bSkKK3sKKwlpbnQgdGFibGVfaW5kZXg7CisKKwkvKiBDbGVhciBEQSBmaWx0ZXIgdW5pY2FzdCB0YWJsZSAoRXhfZEZVVCkgKi8KKwlmb3IgKHRhYmxlX2luZGV4ID0gMDsgdGFibGVfaW5kZXggPD0gMHhDOyB0YWJsZV9pbmRleCArPSA0KQorCQlNVl9SRUdfV1JJVEUgKChNVjY0MzYwX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkgICAgICAgKGV0aF9wb3J0X251bSkgKyB0YWJsZV9pbmRleCksIDApOworCisJZm9yICh0YWJsZV9pbmRleCA9IDA7IHRhYmxlX2luZGV4IDw9IDB4RkM7IHRhYmxlX2luZGV4ICs9IDQpIHsKKwkJLyogQ2xlYXIgREEgZmlsdGVyIHNwZWNpYWwgbXVsdGljYXN0IHRhYmxlIChFeF9kRlNNVCkgKi8KKwkJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0YWJsZV9pbmRleCksIDApOworCQkvKiBDbGVhciBEQSBmaWx0ZXIgb3RoZXIgbXVsdGljYXN0IHRhYmxlIChFeF9kRk9NVCkgKi8KKwkJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgpLCAwKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9jbGVhcl9taWJfY291bnRlcnMgLSBDbGVhciBhbGwgTUlCIGNvdW50ZXJzCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgTUlCIGNvdW50ZXJzIG9mIGEgc3BlY2lmaWMgZXRoZXJuZXQgcG9ydC4KKyogICAgICAgQSByZWFkIGZyb20gdGhlIE1JQiBjb3VudGVyIHdpbGwgcmVzZXQgdGhlIGNvdW50ZXIuCisqCisqIElOUFVUOgorKglFVEhfUE9SVCAgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisqCisqIE9VVFBVVDoKKyogICAgICAgQWZ0ZXIgcmVhZGluZyBhbGwgTUlCIGNvdW50ZXJzLCB0aGUgY291bnRlcnMgcmVzZXRzLgorKgorKiBSRVRVUk46CisqICAgICAgIE1JQiBjb3VudGVyIHZhbHVlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9jbGVhcl9taWJfY291bnRlcnMgKEVUSF9QT1JUIGV0aF9wb3J0X251bSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZHVtbXk7CisKKwkvKiBQZXJmb3JtIGR1bW15IHJlYWRzIGZyb20gTUlCIGNvdW50ZXJzICovCisJZm9yIChpID0gRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1c7IGkgPCBFVEhfTUlCX0xBVEVfQ09MTElTSU9OOworCSAgICAgaSArPSA0KQorCQlkdW1teSA9IE1WX1JFR19SRUFEICgoTVY2NDM2MF9FVEhfTUlCX0NPVU5URVJTX0JBU0UKKwkJCQkgICAgICAoZXRoX3BvcnRfbnVtKSArIGkpKTsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3JlYWRfbWliX2NvdW50ZXIgLSBSZWFkIGEgTUlCIGNvdW50ZXIKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBNSUIgY291bnRlciBvZiBhIHNwZWNpZmljIGV0aGVybmV0IHBvcnQuCisqICAgICAgIE5PVEUgLSBJZiByZWFkIGZyb20gRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1csIHRoZW4gdGhlCisqICAgICAgIGZvbGxvd2luZyByZWFkIG11c3QgYmUgZnJvbSBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0hJR0gKKyogICAgICAgcmVnaXN0ZXIuIFRoZSBzYW1lIGFwcGxpZXMgZm9yIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9MT1cgYW5kCisqICAgICAgIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9ISUdICisqCisqIElOUFVUOgorKglFVEhfUE9SVCAgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisqICAgICAgIHVuc2lnbmVkIGludCBtaWJfb2Zmc2V0ICAgTUlCIGNvdW50ZXIgb2Zmc2V0ICh1c2UgRVRIX01JQl8uLi4gbWFjcm9zKS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBBZnRlciByZWFkaW5nIHRoZSBNSUIgY291bnRlciwgdGhlIGNvdW50ZXIgcmVzZXRzLgorKgorKiBSRVRVUk46CisqICAgICAgIE1JQiBjb3VudGVyIHZhbHVlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGludCBldGhfcmVhZF9taWJfY291bnRlciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgIHVuc2lnbmVkIGludCBtaWJfb2Zmc2V0KQoreworCXJldHVybiAoTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX01JQl9DT1VOVEVSU19CQVNFIChldGhfcG9ydF9udW0pCisJCQkgICAgICsgbWliX29mZnNldCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhlcm5ldF9waHlfc2V0IC0gU2V0IHRoZSBldGhlcm5ldCBwb3J0IFBIWSBhZGRyZXNzLgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHNldCB0aGUgZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcyBhY2NvcmRpbmcgdG8gZ2l2ZW4KKyogICAgICAgcGFyYW1ldGVyLgorKgorKiBJTlBVVDoKKyoJCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorKgorKiBPVVRQVVQ6CisqICAgICAgIFNldCBQSFkgQWRkcmVzcyBSZWdpc3RlciB3aXRoIGdpdmVuIFBIWSBhZGRyZXNzIHBhcmFtZXRlci4KKyoKKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aGVybmV0X3BoeV9zZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwgaW50IHBoeV9hZGRyKQoreworCXVuc2lnbmVkIGludCByZWdfZGF0YTsKKworCXJlZ19kYXRhID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX1BIWV9BRERSX1JFRyk7CisKKwlyZWdfZGF0YSAmPSB+KDB4MUYgPDwgKDUgKiBldGhfcG9ydF9udW0pKTsKKwlyZWdfZGF0YSB8PSAocGh5X2FkZHIgPDwgKDUgKiBldGhfcG9ydF9udW0pKTsKKworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUEhZX0FERFJfUkVHLCByZWdfZGF0YSk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhlcm5ldF9waHlfZ2V0IC0gR2V0IHRoZSBldGhlcm5ldCBwb3J0IFBIWSBhZGRyZXNzLgorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGdpdmVuIGV0aGVybmV0IHBvcnQgUEhZIGFkZHJlc3MuCisgKgorICogSU5QVVQ6CisgKgkJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKgorICogT1VUUFVUOgorICogICAgICAgTm9uZS4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBQSFkgYWRkcmVzcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZXRoZXJuZXRfcGh5X2dldCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCByZWdfZGF0YTsKKworCXJlZ19kYXRhID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX1BIWV9BRERSX1JFRyk7CisKKwlyZXR1cm4gKChyZWdfZGF0YSA+PiAoNSAqIGV0aF9wb3J0X251bSkpICYgMHgxZik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhlcm5ldF9waHlfcmVzZXQgLSBSZXNldCBFdGhlcm5ldCBwb3J0IFBIWS4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgcm91dGluZSB1dGlsaXplIHRoZSBTTUkgaW50ZXJmYWNlIHRvIHJlc2V0IHRoZSBldGhlcm5ldCBwb3J0IFBIWS4KKyAqICAgICAgIFRoZSByb3V0aW5lIHdhaXRzIHVudGlsIHRoZSBsaW5rIGlzIHVwIGFnYWluIG9yIGxpbmsgdXAgaXMgdGltZW91dC4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgIFRoZSBldGhlcm5ldCBwb3J0IFBIWSByZW5ldyBpdHMgbGluay4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBOb25lLgorICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhlcm5ldF9waHlfcmVzZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZV9vdXQgPSA1MDsKKwl1bnNpZ25lZCBpbnQgcGh5X3JlZ19kYXRhOworCisJLyogUmVzZXQgdGhlIFBIWSAqLworCWV0aF9wb3J0X3JlYWRfc21pX3JlZyAoZXRoX3BvcnRfbnVtLCAwLCAmcGh5X3JlZ19kYXRhKTsKKwlwaHlfcmVnX2RhdGEgfD0gMHg4MDAwOwkvKiBTZXQgYml0IDE1IHRvIHJlc2V0IHRoZSBQSFkgKi8KKwlldGhfcG9ydF93cml0ZV9zbWlfcmVnIChldGhfcG9ydF9udW0sIDAsIHBoeV9yZWdfZGF0YSk7CisKKwkvKiBQb2xsIG9uIHRoZSBQSFkgTElOSyAqLworCWRvIHsKKwkJZXRoX3BvcnRfcmVhZF9zbWlfcmVnIChldGhfcG9ydF9udW0sIDEsICZwaHlfcmVnX2RhdGEpOworCisJCWlmICh0aW1lX291dC0tID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCXdoaWxlICghKHBoeV9yZWdfZGF0YSAmIDB4MjApKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfcmVzZXQgLSBSZXNldCBFdGhlcm5ldCBwb3J0CisgKgorICogREVTQ1JJUFRJT046CisgKiAJVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgY2hpcCBieSBhYm9ydGluZyBhbnkgU0RNQSBlbmdpbmUgYWN0aXZpdHkgYW5kCisgKiAgICAgIGNsZWFyaW5nIHRoZSBNSUIgY291bnRlcnMuIFRoZSBSZWNlaXZlciBhbmQgdGhlIFRyYW5zbWl0IHVuaXQgYXJlIGluCisgKiAgICAgIGlkbGUgc3RhdGUgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHBlcmZvcm1lZCBhbmQgdGhlIHBvcnQgaXMgZGlzYWJsZWQuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgICBDaGFubmVsIGFjdGl2aXR5IGlzIGhhbHRlZC4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVzZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisKKwkvKiBTdG9wIFR4IHBvcnQgYWN0aXZpdHkuIENoZWNrIHBvcnQgVHggYWN0aXZpdHkuICovCisJcmVnX2RhdGEgPQorCQlNVl9SRUdfUkVBRCAoTVY2NDM2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcKKwkJCSAgICAgKGV0aF9wb3J0X251bSkpOworCisJaWYgKHJlZ19kYXRhICYgMHhGRikgeworCQkvKiBJc3N1ZSBzdG9wIGNvbW1hbmQgZm9yIGFjdGl2ZSBjaGFubmVscyBvbmx5ICovCisJCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcKKwkJCSAgICAgIChldGhfcG9ydF9udW0pLCAocmVnX2RhdGEgPDwgOCkpOworCisJCS8qIFdhaXQgZm9yIGFsbCBUeCBhY3Rpdml0eSB0byB0ZXJtaW5hdGUuICovCisJCWRvIHsKKwkJCS8qIENoZWNrIHBvcnQgY2F1c2UgcmVnaXN0ZXIgdGhhdCBhbGwgVHggcXVldWVzIGFyZSBzdG9wcGVkICovCisJCQlyZWdfZGF0YSA9CisJCQkJTVZfUkVHX1JFQUQKKwkJCQkoTVY2NDM2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcKKwkJCQkgKGV0aF9wb3J0X251bSkpOworCQl9CisJCXdoaWxlIChyZWdfZGF0YSAmIDB4RkYpOworCX0KKworCS8qIFN0b3AgUnggcG9ydCBhY3Rpdml0eS4gQ2hlY2sgcG9ydCBSeCBhY3Rpdml0eS4gKi8KKwlyZWdfZGF0YSA9CisJCU1WX1JFR19SRUFEIChNVjY0MzYwX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkgICAgIChldGhfcG9ydF9udW0pKTsKKworCWlmIChyZWdfZGF0YSAmIDB4RkYpIHsKKwkJLyogSXNzdWUgc3RvcCBjb21tYW5kIGZvciBhY3RpdmUgY2hhbm5lbHMgb25seSAqLworCQlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcKKwkJCSAgICAgIChldGhfcG9ydF9udW0pLCAocmVnX2RhdGEgPDwgOCkpOworCisJCS8qIFdhaXQgZm9yIGFsbCBSeCBhY3Rpdml0eSB0byB0ZXJtaW5hdGUuICovCisJCWRvIHsKKwkJCS8qIENoZWNrIHBvcnQgY2F1c2UgcmVnaXN0ZXIgdGhhdCBhbGwgUnggcXVldWVzIGFyZSBzdG9wcGVkICovCisJCQlyZWdfZGF0YSA9CisJCQkJTVZfUkVHX1JFQUQKKwkJCQkoTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRworCQkJCSAoZXRoX3BvcnRfbnVtKSk7CisJCX0KKwkJd2hpbGUgKHJlZ19kYXRhICYgMHhGRik7CisJfQorCisKKwkvKiBDbGVhciBhbGwgTUlCIGNvdW50ZXJzICovCisJZXRoX2NsZWFyX21pYl9jb3VudGVycyAoZXRoX3BvcnRfbnVtKTsKKworCS8qIFJlc2V0IHRoZSBFbmFibGUgYml0IGluIHRoZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJcmVnX2RhdGEgPQorCQlNVl9SRUdfUkVBRCAoTVY2NDM2MF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcKKwkJCSAgICAgKGV0aF9wb3J0X251bSkpOworCXJlZ19kYXRhICY9IH5FVEhfU0VSSUFMX1BPUlRfRU5BQkxFOworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIHJlZ19kYXRhKTsKKworCXJldHVybjsKK30KKworI2lmIDAJCQkJLyogTm90IG5lZWRlZCBoZXJlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcgLSBTZXQgc3BlY2lmaWVkIGJpdHMgaW4gY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyBzcGVjaWZpZWQgYml0cyBpbiB0aGUgZ2l2ZW4gZXRoZXJuZXQKKyAqICAgICAgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqICAgICAgdW5zaWduZWQgaW50ICAgIHZhbHVlICAgMzIgYml0IHZhbHVlLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgVGhlIHNldCBiaXRzIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIgYXJlIHNldCBpbiB0aGUgY29uZmlndXJhdGlvbgorICogICAgICByZWdpc3Rlci4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgIE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9zZXRfY29uZmlnX3JlZyAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBldGhfY29uZmlnX3JlZzsKKworCWV0aF9jb25maWdfcmVnID0KKwkJTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX1BPUlRfQ09ORklHX1JFRyAoZXRoX3BvcnRfbnVtKSk7CisJZXRoX2NvbmZpZ19yZWcgfD0gdmFsdWU7CisJTVZfUkVHX1dSSVRFIChNVjY0MzYwX0VUSF9QT1JUX0NPTkZJR19SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIGV0aF9jb25maWdfcmVnKTsKKworCXJldHVybjsKK30KKyNlbmRpZgorCisjaWYgMAkJCQkvKiBGSVhNRSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aGVybmV0X3Jlc2V0X2NvbmZpZ19yZWcgLSBSZXNldCBzcGVjaWZpZWQgYml0cyBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgc3BlY2lmaWVkIGJpdHMgaW4gdGhlIGdpdmVuIEV0aGVybmV0CisgKiAgICAgICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKiAgICAgIHVuc2lnbmVkIGludCAgICB2YWx1ZSAgIDMyIGJpdCB2YWx1ZS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgIFRoZSBzZXQgYml0cyBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyIGFyZSByZXNldCBpbiB0aGUgY29uZmlndXJhdGlvbgorICogICAgICByZWdpc3Rlci4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgIE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9yZXNldF9jb25maWdfcmVnIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZXRoX2NvbmZpZ19yZWc7CisKKwlldGhfY29uZmlnX3JlZyA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0VUSF9QT1JUX0NPTkZJR19FWFRFTkRfUkVHCisJCQkJICAgICAgKGV0aF9wb3J0X251bSkpOworCWV0aF9jb25maWdfcmVnICY9IH52YWx1ZTsKKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIGV0aF9jb25maWdfcmVnKTsKKworCXJldHVybjsKK30KKyNlbmRpZgorCisjaWYgMAkJCQkvKiBOb3QgbmVlZGVkIGhlcmUgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhlcm5ldF9nZXRfY29uZmlnX3JlZyAtIEdldCB0aGUgcG9ydCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUgb2YgdGhlIGdpdmVuCisgKiAgICAgICBldGhlcm5ldCBwb3J0LgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKgorICogT1VUUFVUOgorICogICAgICAgTm9uZS4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBQb3J0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aGVybmV0X2dldF9jb25maWdfcmVnIChFVEhfUE9SVCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IGV0aF9jb25maWdfcmVnOworCisJZXRoX2NvbmZpZ19yZWcgPSBNVl9SRUdfUkVBRCAoTVY2NDM2MF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRworCQkJCSAgICAgIChldGhfcG9ydF9udW0pKTsKKwlyZXR1cm4gZXRoX2NvbmZpZ19yZWc7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfcmVhZF9zbWlfcmVnIC0gUmVhZCBQSFkgcmVnaXN0ZXJzCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIHJvdXRpbmUgdXRpbGl6ZSB0aGUgU01JIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBQSFkgaW4KKyAqICAgICAgIG9yZGVyIHRvIHBlcmZvcm0gUEhZIHJlZ2lzdGVyIHJlYWQuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqICAgICAgIHVuc2lnbmVkIGludCAgIHBoeV9yZWcgICBQSFkgcmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXQuCisgKiAgICAgICB1bnNpZ25lZCBpbnQgICAqdmFsdWUgICBSZWdpc3RlciB2YWx1ZSBidWZmZXIuCisgKgorICogT1VUUFVUOgorICogICAgICAgV3JpdGUgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIFBIWSByZWdpc3RlciBpbnRvIGdpdmVuIGJ1ZmZlci4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBmYWxzZSBpZiB0aGUgUEhZIGlzIGJ1c3kgb3IgcmVhZCBkYXRhIGlzIG5vdCBpbiB2YWxpZCBzdGF0ZS4KKyAqICAgICAgIHRydWUgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfcmVhZF9zbWlfcmVnIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICAgdW5zaWduZWQgaW50IHBoeV9yZWcsIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJlZ192YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdGltZV9vdXQgPSBQSFlfQlVTWV9USU1FT1VUOworCWludCBwaHlfYWRkcjsKKworCXBoeV9hZGRyID0gZXRoZXJuZXRfcGh5X2dldCAoZXRoX3BvcnRfbnVtKTsKKy8qICAgIHByaW50ZigiICAgICBQaHktUG9ydCAlZCBoYXMgYWRkZXNzICVkICBcbiIsZXRoX3BvcnRfbnVtLCBwaHlfYWRkciApOyovCisKKwkvKiBmaXJzdCBjaGVjayB0aGF0IGl0IGlzIG5vdCBidXN5ICovCisJZG8geworCQlyZWdfdmFsdWUgPSBNVl9SRUdfUkVBRCAoTVY2NDM2MF9FVEhfU01JX1JFRyk7CisJCWlmICh0aW1lX291dC0tID09IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwl3aGlsZSAocmVnX3ZhbHVlICYgRVRIX1NNSV9CVVNZKTsKKworCS8qIG5vdCBidXN5ICovCisKKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1NNSV9SRUcsCisJCSAgICAgIChwaHlfYWRkciA8PCAxNikgfCAocGh5X3JlZyA8PCAyMSkgfAorCQkgICAgICBFVEhfU01JX09QQ09ERV9SRUFEKTsKKworCXRpbWVfb3V0ID0gUEhZX0JVU1lfVElNRU9VVDsJLyogaW5pdGlhbGl6ZSB0aGUgdGltZSBvdXQgdmFyIGFnYWluICovCisKKwlkbyB7CisJCXJlZ192YWx1ZSA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0VUSF9TTUlfUkVHKTsKKwkJaWYgKHRpbWVfb3V0LS0gPT0gMCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXdoaWxlICgocmVnX3ZhbHVlICYgRVRIX1NNSV9SRUFEX1ZBTElEKSAhPSBFVEhfU01JX1JFQURfVkFMSUQpOwkvKiBCaXQgc2V0IGVxdSBvcGVyYXRpb24gZG9uZSAqLworCisJLyogV2FpdCBmb3IgdGhlIGRhdGEgdG8gdXBkYXRlIGluIHRoZSBTTUkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1VQREFURV9USU1FT1VUCTEwMDAwCisJZm9yICh0aW1lX291dCA9IDA7IHRpbWVfb3V0IDwgUEhZX1VQREFURV9USU1FT1VUOyB0aW1lX291dCsrKTsKKworCXJlZ192YWx1ZSA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0VUSF9TTUlfUkVHKTsKKworCSp2YWx1ZSA9IHJlZ192YWx1ZSAmIDB4ZmZmZjsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfd3JpdGVfc21pX3JlZyAtIFdyaXRlIHRvIFBIWSByZWdpc3RlcnMKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgcm91dGluZSB1dGlsaXplIHRoZSBTTUkgaW50ZXJmYWNlIHRvIGludGVyYWN0IHdpdGggdGhlIFBIWSBpbgorICogICAgICAgb3JkZXIgdG8gcGVyZm9ybSB3cml0ZXMgdG8gUEhZIHJlZ2lzdGVycy4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorICogICAgICB1bnNpZ25lZCBpbnQgICBwaHlfcmVnICAgUEhZIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0LgorICogICAgICB1bnNpZ25lZCBpbnQgICAgdmFsdWUgICBSZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgIFdyaXRlIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIFBIWSByZWdpc3Rlci4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgIGZhbHNlIGlmIHRoZSBQSFkgaXMgYnVzeS4KKyAqICAgICAgdHJ1ZSBvdGhlcndpc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhfcG9ydF93cml0ZV9zbWlfcmVnIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICAgIHVuc2lnbmVkIGludCBwaHlfcmVnLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJlZ192YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdGltZV9vdXQgPSBQSFlfQlVTWV9USU1FT1VUOworCWludCBwaHlfYWRkcjsKKworCXBoeV9hZGRyID0gZXRoZXJuZXRfcGh5X2dldCAoZXRoX3BvcnRfbnVtKTsKKworCS8qIGZpcnN0IGNoZWNrIHRoYXQgaXQgaXMgbm90IGJ1c3kgKi8KKwlkbyB7CisJCXJlZ192YWx1ZSA9IE1WX1JFR19SRUFEIChNVjY0MzYwX0VUSF9TTUlfUkVHKTsKKwkJaWYgKHRpbWVfb3V0LS0gPT0gMCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCXdoaWxlIChyZWdfdmFsdWUgJiBFVEhfU01JX0JVU1kpOworCisJLyogbm90IGJ1c3kgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1NNSV9SRUcsCisJCSAgICAgIChwaHlfYWRkciA8PCAxNikgfCAocGh5X3JlZyA8PCAyMSkgfAorCQkgICAgICBFVEhfU01JX09QQ09ERV9XUklURSB8ICh2YWx1ZSAmIDB4ZmZmZikpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3NldF9hY2Nlc3NfY29udHJvbCAtIENvbmZpZyBhZGRyZXNzIGRlY29kZSBwYXJhbWV0ZXJzIGZvciBFdGhlcm5ldCB1bml0CisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIGFkZHJlc3MgZGVjb2RlIHBhcmFtZXRlcnMgZm9yIHRoZSBHaWdhYml0CisgKiAgICAgICBFdGhlcm5ldCBDb250cm9sbGVyIGFjY29yZGluZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBzdHJ1Y3QuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqICAgICAgIEVUSF9XSU5fUEFSQU0gICpwYXJhbSAgIEFkZHJlc3MgZGVjb2RlIHBhcmFtZXRlciBzdHJ1Y3QuCisgKgorICogT1VUUFVUOgorICogICAgICAgQW4gYWNjZXNzIHdpbmRvdyBpcyBvcGVuZWQgdXNpbmcgdGhlIGdpdmVuIGFjY2VzcyBwYXJhbWV0ZXJzLgorICoKKyAqIFJFVFVSTjoKKyAqICAgICAgIE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfc2V0X2FjY2Vzc19jb250cm9sIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICAgIEVUSF9XSU5fUEFSQU0gKiBwYXJhbSkKK3sKKwl1bnNpZ25lZCBpbnQgYWNjZXNzX3Byb3RfcmVnOworCisJLyogU2V0IGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyICovCisJYWNjZXNzX3Byb3RfcmVnID0gTVZfUkVHX1JFQUQgKE1WNjQzNjBfRVRIX0FDQ0VTU19QUk9URUNUSU9OX1JFRworCQkJCSAgICAgICAoZXRoX3BvcnRfbnVtKSk7CisJYWNjZXNzX3Byb3RfcmVnICY9ICh+KDMgPDwgKHBhcmFtLT53aW4gKiAyKSkpOwkvKiBjbGVhciB3aW5kb3cgcGVybWlzc2lvbiAqLworCWFjY2Vzc19wcm90X3JlZyB8PSAocGFyYW0tPmFjY2Vzc19jdHJsIDw8IChwYXJhbS0+d2luICogMikpOworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfQUNDRVNTX1BST1RFQ1RJT05fUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBhY2Nlc3NfcHJvdF9yZWcpOworCisJLyogU2V0IHdpbmRvdyBTaXplIHJlZyAoU1IpICovCisJTVZfUkVHX1dSSVRFICgoTVY2NDM2MF9FVEhfU0laRV9SRUdfMCArCisJCSAgICAgICAoRVRIX1NJWkVfUkVHX0dBUCAqIHBhcmFtLT53aW4pKSwKKwkJICAgICAgKCgocGFyYW0tPnNpemUgLyAweDEwMDAwKSAtIDEpIDw8IDE2KSk7CisKKwkvKiBTZXQgd2luZG93IEJhc2UgYWRkcmVzcyByZWcgKEJBKSAqLworCU1WX1JFR19XUklURSAoKE1WNjQzNjBfRVRIX0JBUl8wICsgKEVUSF9CQVJfR0FQICogcGFyYW0tPndpbikpLAorCQkgICAgICAocGFyYW0tPnRhcmdldCB8IHBhcmFtLT5hdHRyaWJ1dGVzIHwgcGFyYW0tPmJhc2VfYWRkcikpOworCS8qIEhpZ2ggYWRkcmVzcyByZW1hcCByZWcgKEhBUlIpICovCisJaWYgKHBhcmFtLT53aW4gPCA0KQorCQlNVl9SRUdfV1JJVEUgKChNVjY0MzYwX0VUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzAgKworCQkJICAgICAgIChFVEhfSElHSF9BRERSX1JFTUFQX1JFR19HQVAgKiBwYXJhbS0+d2luKSksCisJCQkgICAgICBwYXJhbS0+aGlnaF9hZGRyKTsKKworCS8qIEJhc2UgYWRkcmVzcyBlbmFibGUgcmVnIChCQVJFUikgKi8KKwlpZiAocGFyYW0tPmVuYWJsZSA9PSAxKQorCQlNVl9SRVNFVF9SRUdfQklUUyAoTVY2NDM2MF9FVEhfQkFTRV9BRERSX0VOQUJMRV9SRUcsCisJCQkJICAgKDEgPDwgcGFyYW0tPndpbikpOworCWVsc2UKKwkJTVZfU0VUX1JFR19CSVRTIChNVjY0MzYwX0VUSF9CQVNFX0FERFJfRU5BQkxFX1JFRywKKwkJCQkgKDEgPDwgcGFyYW0tPndpbikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgLSBDdXJ2ZSBhIFJ4IGNoYWluIGRlc2MgbGlzdCBhbmQgYnVmZmVyIGluIG1lbW9yeS4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBSeCBjaGFpbmVkIGxpc3Qgb2YgZGVzY3JpcHRvcnMgYW5kIHBhY2tldAorICogICAgICAgYnVmZmVycyBpbiBhIGZvcm0gb2YgYSByaW5nLiBUaGUgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBwb3J0CisgKiAgICAgICBpbml0aWFsaXphdGlvbiByb3V0aW5lIGFuZCBiZWZvcmUgcG9ydCBzdGFydCByb3V0aW5lLgorICogICAgICAgVGhlIEV0aGVybmV0IFNETUEgZW5naW5lIHVzZXMgQ1BVIGJ1cyBhZGRyZXNzZXMgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCisgKiAgICAgICBkZXZpY2VzIGluIHRoZSBzeXN0ZW0gKGkuZS4gRFJBTSkuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZXRoZXJuZXQKKyAqICAgICAgIHN0cnVjdCAndmlydHVhbCB0byBwaHlzaWNhbCcgcm91dGluZSAoc2V0IGJ5IHRoZSB1c2VyKSB0byBzZXQgdGhlIHJpbmcKKyAqICAgICAgIHdpdGggcGh5c2ljYWwgYWRkcmVzc2VzLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlRfSU5GTyAgICpwX2V0aF9wb3J0X2N0cmwgICBFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJRVRIX1FVRVVFICAgCXJ4X3F1ZXVlICAgICAgICAgTnVtYmVyIG9mIFJ4IHF1ZXVlLgorICogICAgICBpbnQgCQkJcnhfZGVzY19udW0gICAgICAgTnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3JzCisgKiAgICAgIGludCAJCQlyeF9idWZmX3NpemUgICAgICBTaXplIG9mIFJ4IGJ1ZmZlcgorICogICAgICB1bnNpZ25lZCBpbnQgICAgcnhfZGVzY19iYXNlX2FkZHIgIFJ4IGRlc2NyaXB0b3JzIG1lbW9yeSBhcmVhIGJhc2UgYWRkci4KKyAqICAgICAgdW5zaWduZWQgaW50ICAgIHJ4X2J1ZmZfYmFzZV9hZGRyICBSeCBidWZmZXIgbWVtb3J5IGFyZWEgYmFzZSBhZGRyLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgVGhlIHJvdXRpbmUgdXBkYXRlcyB0aGUgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdCB3aXRoIGluZm9ybWF0aW9uCisgKiAgICAgIHJlZ2FyZGluZyB0aGUgUnggZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMuCisgKgorICogUkVUVVJOOgorICogICAgICBmYWxzZSBpZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMgbWVtb3J5IGFyZWEgaXMgbm90IGFsaWduZWQgYWNjb3JkaW5nIHRvCisgKiAgICAgIEV0aGVybmV0IFNETUEgc3BlY2lmaWNhdGlvbnMuCisgKiAgICAgIHRydWUgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgKEVUSF9QT1JUX0lORk8gKiBwX2V0aF9wb3J0X2N0cmwsCisJCQkJICAgICBFVEhfUVVFVUUgcnhfcXVldWUsCisJCQkJICAgICBpbnQgcnhfZGVzY19udW0sCisJCQkJICAgICBpbnQgcnhfYnVmZl9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJ4X2Rlc2NfYmFzZV9hZGRyLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJ4X2J1ZmZfYmFzZV9hZGRyKQoreworCUVUSF9SWF9ERVNDICpwX3J4X2Rlc2M7CisJRVRIX1JYX0RFU0MgKnBfcnhfcHJldl9kZXNjOwkvKiBwb2ludGVyIHRvIGxpbmsgd2l0aCB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJdW5zaWduZWQgaW50IGJ1ZmZlcl9hZGRyOworCWludCBpeDsJCQkvKiBhIGNvdW50ZXIgKi8KKworCisJcF9yeF9kZXNjID0gKEVUSF9SWF9ERVNDICopIHJ4X2Rlc2NfYmFzZV9hZGRyOworCXBfcnhfcHJldl9kZXNjID0gcF9yeF9kZXNjOworCWJ1ZmZlcl9hZGRyID0gcnhfYnVmZl9iYXNlX2FkZHI7CisKKwkvKiBSeCBkZXNjIE11c3QgYmUgNExXIGFsaWduZWQgKGkuZS4gRGVzY3JpcHRvcl9BZGRyZXNzWzM6MF09MDAwMCkuICovCisJaWYgKHJ4X2J1ZmZfYmFzZV9hZGRyICYgMHhGKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBSeCBidWZmZXJzIGFyZSBsaW1pdGVkIHRvIDY0SyBieXRlcyBhbmQgTWluaW11bSBzaXplIGlzIDggYnl0ZXMgICovCisJaWYgKChyeF9idWZmX3NpemUgPCA4KSB8fCAocnhfYnVmZl9zaXplID4gUlhfQlVGRkVSX01BWF9TSVpFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUnggYnVmZmVycyBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkLiAgICAgICAqLworCWlmICgocnhfYnVmZl9iYXNlX2FkZHIgKyByeF9idWZmX3NpemUpICYgMHg3KQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBpbml0aWFsaXplIHRoZSBSeCBkZXNjcmlwdG9ycyByaW5nICovCisJZm9yIChpeCA9IDA7IGl4IDwgcnhfZGVzY19udW07IGl4KyspIHsKKwkJcF9yeF9kZXNjLT5idWZfc2l6ZSA9IHJ4X2J1ZmZfc2l6ZTsKKwkJcF9yeF9kZXNjLT5ieXRlX2NudCA9IDB4MDAwMDsKKwkJcF9yeF9kZXNjLT5jbWRfc3RzID0KKwkJCUVUSF9CVUZGRVJfT1dORURfQllfRE1BIHwgRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQ7CisJCXBfcnhfZGVzYy0+bmV4dF9kZXNjX3B0ciA9CisJCQkoKHVuc2lnbmVkIGludCkgcF9yeF9kZXNjKSArIFJYX0RFU0NfQUxJR05FRF9TSVpFOworCQlwX3J4X2Rlc2MtPmJ1Zl9wdHIgPSBidWZmZXJfYWRkcjsKKwkJcF9yeF9kZXNjLT5yZXR1cm5faW5mbyA9IDB4MDAwMDAwMDA7CisJCURfQ0FDSEVfRkxVU0hfTElORSAocF9yeF9kZXNjLCAwKTsKKwkJYnVmZmVyX2FkZHIgKz0gcnhfYnVmZl9zaXplOworCQlwX3J4X3ByZXZfZGVzYyA9IHBfcnhfZGVzYzsKKwkJcF9yeF9kZXNjID0gKEVUSF9SWF9ERVNDICopCisJCQkoKHVuc2lnbmVkIGludCkgcF9yeF9kZXNjICsgUlhfREVTQ19BTElHTkVEX1NJWkUpOworCX0KKworCS8qIENsb3NpbmcgUnggZGVzY3JpcHRvcnMgcmluZyAqLworCXBfcnhfcHJldl9kZXNjLT5uZXh0X2Rlc2NfcHRyID0gKHJ4X2Rlc2NfYmFzZV9hZGRyKTsKKwlEX0NBQ0hFX0ZMVVNIX0xJTkUgKHBfcnhfcHJldl9kZXNjLCAwKTsKKworCS8qIFNhdmUgUnggZGVzYyBwb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3QuICovCisJQ1VSUl9SRkRfU0VUICgoRVRIX1JYX0RFU0MgKikgcnhfZGVzY19iYXNlX2FkZHIsIHJ4X3F1ZXVlKTsKKwlVU0VEX1JGRF9TRVQgKChFVEhfUlhfREVTQyAqKSByeF9kZXNjX2Jhc2VfYWRkciwgcnhfcXVldWUpOworCisJcF9ldGhfcG9ydF9jdHJsLT5wX3J4X2Rlc2NfYXJlYV9iYXNlW3J4X3F1ZXVlXSA9CisJCShFVEhfUlhfREVTQyAqKSByeF9kZXNjX2Jhc2VfYWRkcjsKKwlwX2V0aF9wb3J0X2N0cmwtPnJ4X2Rlc2NfYXJlYV9zaXplW3J4X3F1ZXVlXSA9CisJCXJ4X2Rlc2NfbnVtICogUlhfREVTQ19BTElHTkVEX1NJWkU7CisKKwlwX2V0aF9wb3J0X2N0cmwtPnBvcnRfcnhfcXVldWVfY29tbWFuZCB8PSAoMSA8PCByeF9xdWV1ZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nIC0gQ3VydmUgYSBUeCBjaGFpbiBkZXNjIGxpc3QgYW5kIGJ1ZmZlciBpbiBtZW1vcnkuCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgVHggY2hhaW5lZCBsaXN0IG9mIGRlc2NyaXB0b3JzIGFuZCBwYWNrZXQKKyAqICAgICAgIGJ1ZmZlcnMgaW4gYSBmb3JtIG9mIGEgcmluZy4gVGhlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcG9ydAorICogICAgICAgaW5pdGlhbGl6YXRpb24gcm91dGluZSBhbmQgYmVmb3JlIHBvcnQgc3RhcnQgcm91dGluZS4KKyAqICAgICAgIFRoZSBFdGhlcm5ldCBTRE1BIGVuZ2luZSB1c2VzIENQVSBidXMgYWRkcmVzc2VzIHRvIGFjY2VzcyB0aGUgdmFyaW91cworICogICAgICAgZGV2aWNlcyBpbiB0aGUgc3lzdGVtIChpLmUuIERSQU0pLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGV0aGVybmV0CisgKiAgICAgICBzdHJ1Y3QgJ3ZpcnR1YWwgdG8gcGh5c2ljYWwnIHJvdXRpbmUgKHNldCBieSB0aGUgdXNlcikgdG8gc2V0IHRoZSByaW5nCisgKiAgICAgICB3aXRoIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAl0eF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBUeCBxdWV1ZS4KKyAqICAgICAgaW50IAkJCXR4X2Rlc2NfbnVtICAgICAgIE51bWJlciBvZiBUeCBkZXNjcmlwdG9ycworICogICAgICBpbnQgCQkJdHhfYnVmZl9zaXplICAgICAgU2l6ZSBvZiBUeCBidWZmZXIKKyAqICAgICAgdW5zaWduZWQgaW50ICAgIHR4X2Rlc2NfYmFzZV9hZGRyICBUeCBkZXNjcmlwdG9ycyBtZW1vcnkgYXJlYSBiYXNlIGFkZHIuCisgKiAgICAgIHVuc2lnbmVkIGludCAgICB0eF9idWZmX2Jhc2VfYWRkciAgVHggYnVmZmVyIG1lbW9yeSBhcmVhIGJhc2UgYWRkci4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgIFRoZSByb3V0aW5lIHVwZGF0ZXMgdGhlIEV0aGVybmV0IHBvcnQgY29udHJvbCBzdHJ1Y3Qgd2l0aCBpbmZvcm1hdGlvbgorICogICAgICByZWdhcmRpbmcgdGhlIFR4IGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzLgorICoKKyAqIFJFVFVSTjoKKyAqICAgICAgZmFsc2UgaWYgdGhlIGdpdmVuIGRlc2NyaXB0b3JzIG1lbW9yeSBhcmVhIGlzIG5vdCBhbGlnbmVkIGFjY29yZGluZyB0bworICogICAgICBFdGhlcm5ldCBTRE1BIHNwZWNpZmljYXRpb25zLgorICogICAgICB0cnVlIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nIChFVEhfUE9SVF9JTkZPICogcF9ldGhfcG9ydF9jdHJsLAorCQkJCSAgICAgRVRIX1FVRVVFIHR4X3F1ZXVlLAorCQkJCSAgICAgaW50IHR4X2Rlc2NfbnVtLAorCQkJCSAgICAgaW50IHR4X2J1ZmZfc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eF9kZXNjX2Jhc2VfYWRkciwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0eF9idWZmX2Jhc2VfYWRkcikKK3sKKworCUVUSF9UWF9ERVNDICpwX3R4X2Rlc2M7CisJRVRIX1RYX0RFU0MgKnBfdHhfcHJldl9kZXNjOworCXVuc2lnbmVkIGludCBidWZmZXJfYWRkcjsKKwlpbnQgaXg7CQkJLyogYSBjb3VudGVyICovCisKKworCS8qIHNhdmUgdGhlIGZpcnN0IGRlc2MgcG9pbnRlciB0byBsaW5rIHdpdGggdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCXBfdHhfZGVzYyA9IChFVEhfVFhfREVTQyAqKSB0eF9kZXNjX2Jhc2VfYWRkcjsKKwlwX3R4X3ByZXZfZGVzYyA9IHBfdHhfZGVzYzsKKwlidWZmZXJfYWRkciA9IHR4X2J1ZmZfYmFzZV9hZGRyOworCisJLyogVHggZGVzYyBNdXN0IGJlIDRMVyBhbGlnbmVkIChpLmUuIERlc2NyaXB0b3JfQWRkcmVzc1szOjBdPTAwMDApLiAqLworCWlmICh0eF9idWZmX2Jhc2VfYWRkciAmIDB4RikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogVHggYnVmZmVycyBhcmUgbGltaXRlZCB0byA2NEsgYnl0ZXMgYW5kIE1pbmltdW0gc2l6ZSBpcyA4IGJ5dGVzICAqLworCWlmICgodHhfYnVmZl9zaXplID4gVFhfQlVGRkVSX01BWF9TSVpFKQorCSAgICB8fCAodHhfYnVmZl9zaXplIDwgVFhfQlVGRkVSX01JTl9TSVpFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgVHggZGVzY3JpcHRvcnMgcmluZyAqLworCWZvciAoaXggPSAwOyBpeCA8IHR4X2Rlc2NfbnVtOyBpeCsrKSB7CisJCXBfdHhfZGVzYy0+Ynl0ZV9jbnQgPSAweDAwMDA7CisJCXBfdHhfZGVzYy0+bDRpX2NoayA9IDB4MDAwMDsKKwkJcF90eF9kZXNjLT5jbWRfc3RzID0gMHgwMDAwMDAwMDsKKwkJcF90eF9kZXNjLT5uZXh0X2Rlc2NfcHRyID0KKwkJCSgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2MpICsgVFhfREVTQ19BTElHTkVEX1NJWkU7CisKKwkJcF90eF9kZXNjLT5idWZfcHRyID0gYnVmZmVyX2FkZHI7CisJCXBfdHhfZGVzYy0+cmV0dXJuX2luZm8gPSAweDAwMDAwMDAwOworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKHBfdHhfZGVzYywgMCk7CisJCWJ1ZmZlcl9hZGRyICs9IHR4X2J1ZmZfc2l6ZTsKKwkJcF90eF9wcmV2X2Rlc2MgPSBwX3R4X2Rlc2M7CisJCXBfdHhfZGVzYyA9IChFVEhfVFhfREVTQyAqKQorCQkJKCh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzYyArIFRYX0RFU0NfQUxJR05FRF9TSVpFKTsKKworCX0KKwkvKiBDbG9zaW5nIFR4IGRlc2NyaXB0b3JzIHJpbmcgKi8KKwlwX3R4X3ByZXZfZGVzYy0+bmV4dF9kZXNjX3B0ciA9IHR4X2Rlc2NfYmFzZV9hZGRyOworCURfQ0FDSEVfRkxVU0hfTElORSAocF90eF9wcmV2X2Rlc2MsIDApOworCS8qIFNldCBUeCBkZXNjIHBvaW50ZXIgaW4gZHJpdmVyIHN0cnVjdC4gKi8KKwlDVVJSX1RGRF9TRVQgKChFVEhfVFhfREVTQyAqKSB0eF9kZXNjX2Jhc2VfYWRkciwgdHhfcXVldWUpOworCVVTRURfVEZEX1NFVCAoKEVUSF9UWF9ERVNDICopIHR4X2Rlc2NfYmFzZV9hZGRyLCB0eF9xdWV1ZSk7CisKKwkvKiBJbml0IFR4IHJpbmcgYmFzZSBhbmQgc2l6ZSBwYXJhbWV0ZXJzICovCisJcF9ldGhfcG9ydF9jdHJsLT5wX3R4X2Rlc2NfYXJlYV9iYXNlW3R4X3F1ZXVlXSA9CisJCShFVEhfVFhfREVTQyAqKSB0eF9kZXNjX2Jhc2VfYWRkcjsKKwlwX2V0aF9wb3J0X2N0cmwtPnR4X2Rlc2NfYXJlYV9zaXplW3R4X3F1ZXVlXSA9CisJCSh0eF9kZXNjX251bSAqIFRYX0RFU0NfQUxJR05FRF9TSVpFKTsKKworCS8qIEFkZCB0aGUgcXVldWUgdG8gdGhlIGxpc3Qgb2YgVHggcXVldWVzIG9mIHRoaXMgcG9ydCAqLworCXBfZXRoX3BvcnRfY3RybC0+cG9ydF90eF9xdWV1ZV9jb21tYW5kIHw9ICgxIDw8IHR4X3F1ZXVlKTsKKworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfc2VuZCAtIFNlbmQgYW4gRXRoZXJuZXQgcGFja2V0CisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgc2VuZCBhIGdpdmVuIHBhY2tldCBkZXNjcmliZWQgYnkgcF9wa3RpbmZvIHBhcmFtZXRlci4gSXQKKyAqICAgICAgc3VwcG9ydHMgdHJhbnNtaXR0aW5nIG9mIGEgcGFja2V0IHNwYW5lZCBvdmVyIG11bHRpcGxlIGJ1ZmZlcnMuIFRoZQorICogICAgICByb3V0aW5lIHVwZGF0ZXMgJ2N1cnInIGFuZCAnZmlyc3QnIGluZGV4ZXMgYWNjb3JkaW5nIHRvIHRoZSBwYWNrZXQKKyAqICAgICAgc2VnbWVudCBwYXNzZWQgdG8gdGhlIHJvdXRpbmUuIEluIGNhc2UgdGhlIHBhY2tldCBzZWdtZW50IGlzIGZpcnN0LAorICogICAgICB0aGUgJ2ZpcnN0JyBpbmRleCBpcyB1cGRhdGUuIEluIGFueSBjYXNlLCB0aGUgJ2N1cnInIGluZGV4IGlzIHVwZGF0ZWQuCisgKiAgICAgIElmIHRoZSByb3V0aW5lIGdldCBpbnRvIFR4IHJlc291cmNlIGVycm9yIGl0IGFzc2lnbnMgJ2N1cnInIGluZGV4IGFzCisgKiAgICAgICdmaXJzdCcuIFRoaXMgd2F5IHRoZSBmdW5jdGlvbiBjYW4gYWJvcnQgVHggcHJvY2VzcyBvZiBtdWx0aXBsZQorICogICAgICBkZXNjcmlwdG9ycyBwZXIgcGFja2V0LgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlRfSU5GTyAgICpwX2V0aF9wb3J0X2N0cmwgICBFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJRVRIX1FVRVVFICAgCXR4X3F1ZXVlICAgICAgICAgTnVtYmVyIG9mIFR4IHF1ZXVlLgorICoJUEtUX0lORk8gICAgICAgICpwX3BrdF9pbmZvICAgICAgIFVzZXIgcGFja2V0IGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglUeCByaW5nICdjdXJyJyBhbmQgJ2ZpcnN0JyBpbmRleGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqICAgICAgRVRIX1FVRVVFX0ZVTEwgaW4gY2FzZSBvZiBUeCByZXNvdXJjZSBlcnJvci4KKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFR4IGRlc2MgcmluZy4KKyAqCUVUSF9RVUVVRV9MQVNUX1JFU09VUkNFIGlmIHRoZSByb3V0aW5lIHVzZXMgdGhlIGxhc3QgVHggcmVzb3VyY2UuCisgKiAgICAgIEVUSF9PSyBvdGhlcndpc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9zZW5kIChFVEhfUE9SVF9JTkZPICogcF9ldGhfcG9ydF9jdHJsLAorCQkJCQkgIEVUSF9RVUVVRSB0eF9xdWV1ZSwKKwkJCQkJICBQS1RfSU5GTyAqIHBfcGt0X2luZm8pCit7CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfZGVzY19maXJzdDsKKwl2b2xhdGlsZSBFVEhfVFhfREVTQyAqcF90eF9kZXNjX2N1cnI7CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfbmV4dF9kZXNjX2N1cnI7CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfZGVzY191c2VkOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCS8qIERvIG5vdCBwcm9jZXNzIFR4IHJpbmcgaW4gY2FzZSBvZiBUeCByaW5nIHJlc291cmNlIGVycm9yICovCisJaWYgKHBfZXRoX3BvcnRfY3RybC0+dHhfcmVzb3VyY2VfZXJyW3R4X3F1ZXVlXSA9PSB0cnVlKQorCQlyZXR1cm4gRVRIX1FVRVVFX0ZVTEw7CisKKwkvKiBHZXQgdGhlIFR4IERlc2MgcmluZyBpbmRleGVzICovCisJQ1VSUl9URkRfR0VUIChwX3R4X2Rlc2NfY3VyciwgdHhfcXVldWUpOworCVVTRURfVEZEX0dFVCAocF90eF9kZXNjX3VzZWQsIHR4X3F1ZXVlKTsKKworCWlmIChwX3R4X2Rlc2NfY3VyciA9PSBOVUxMKQorCQlyZXR1cm4gRVRIX0VSUk9SOworCisJLyogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNhdmUgcmVhZGluZ3MgZnJvbSBtZW1vcnkgKi8KKwlwX3R4X25leHRfZGVzY19jdXJyID0gVFhfTkVYVF9ERVNDX1BUUiAocF90eF9kZXNjX2N1cnIsIHR4X3F1ZXVlKTsKKwljb21tYW5kX3N0YXR1cyA9IHBfcGt0X2luZm8tPmNtZF9zdHMgfCBFVEhfWkVST19QQURESU5HIHwgRVRIX0dFTl9DUkM7CisKKwlpZiAoY29tbWFuZF9zdGF0dXMgJiAoRVRIX1RYX0ZJUlNUX0RFU0MpKSB7CisJCS8qIFVwZGF0ZSBmaXJzdCBkZXNjICovCisJCUZJUlNUX1RGRF9TRVQgKHBfdHhfZGVzY19jdXJyLCB0eF9xdWV1ZSk7CisJCXBfdHhfZGVzY19maXJzdCA9IHBfdHhfZGVzY19jdXJyOworCX0gZWxzZSB7CisJCUZJUlNUX1RGRF9HRVQgKHBfdHhfZGVzY19maXJzdCwgdHhfcXVldWUpOworCQljb21tYW5kX3N0YXR1cyB8PSBFVEhfQlVGRkVSX09XTkVEX0JZX0RNQTsKKwl9CisKKwkvKiBCdWZmZXJzIHdpdGggYSBwYXlsb2FkIHNtYWxsZXIgdGhhbiA4IGJ5dGVzIG11c3QgYmUgYWxpZ25lZCB0byA2NC1iaXQgKi8KKwkvKiBib3VuZGFyeS4gV2UgdXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBUeCBkZXNjcmlwdG9yLiBUaGlzIG1lbW9yeSAgKi8KKwkvKiBsb2NhdGVkIGluIFRYX0JVRl9PRkZTRVRfSU5fREVTQyBvZmZzZXQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yLiAqLworCWlmIChwX3BrdF9pbmZvLT5ieXRlX2NudCA8PSA4KSB7CisJCXByaW50ZiAoIllvdSBoYXZlIGZhaWxlZCBpbiB0aGUgPCA4IGJ5dGVzIGVycmF0YSAtIGZpeG1lXG4iKTsJLyogUkFCRUVIIC0gVEJEICovCisJCXJldHVybiBFVEhfRVJST1I7CisKKwkJcF90eF9kZXNjX2N1cnItPmJ1Zl9wdHIgPQorCQkJKHVuc2lnbmVkIGludCkgcF90eF9kZXNjX2N1cnIgKyBUWF9CVUZfT0ZGU0VUX0lOX0RFU0M7CisJCWV0aF9iX2NvcHkgKHBfcGt0X2luZm8tPmJ1Zl9wdHIsIHBfdHhfZGVzY19jdXJyLT5idWZfcHRyLAorCQkJICAgIHBfcGt0X2luZm8tPmJ5dGVfY250KTsKKwl9IGVsc2UKKwkJcF90eF9kZXNjX2N1cnItPmJ1Zl9wdHIgPSBwX3BrdF9pbmZvLT5idWZfcHRyOworCisJcF90eF9kZXNjX2N1cnItPmJ5dGVfY250ID0gcF9wa3RfaW5mby0+Ynl0ZV9jbnQ7CisJcF90eF9kZXNjX2N1cnItPnJldHVybl9pbmZvID0gcF9wa3RfaW5mby0+cmV0dXJuX2luZm87CisKKwlpZiAocF9wa3RfaW5mby0+Y21kX3N0cyAmIChFVEhfVFhfTEFTVF9ERVNDKSkgeworCQkvKiBTZXQgbGFzdCBkZXNjIHdpdGggRE1BIG93bmVyc2hpcCBhbmQgaW50ZXJydXB0IGVuYWJsZS4gKi8KKwkJcF90eF9kZXNjX2N1cnItPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1cyB8CisJCQlFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSB8IEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUOworCisJCWlmIChwX3R4X2Rlc2NfY3VyciAhPSBwX3R4X2Rlc2NfZmlyc3QpCisJCQlwX3R4X2Rlc2NfZmlyc3QtPmNtZF9zdHMgfD0gRVRIX0JVRkZFUl9PV05FRF9CWV9ETUE7CisKKwkJLyogRmx1c2ggQ1BVIHBpcGUgKi8KKworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzY19jdXJyLCAwKTsKKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2NfZmlyc3QsIDApOworCQlDUFVfUElQRV9GTFVTSDsKKworCQkvKiBBcHBseSBzZW5kIGNvbW1hbmQgKi8KKwkJRVRIX0VOQUJMRV9UWF9RVUVVRSAodHhfcXVldWUsIHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0pOworCisJCS8qIEZpbmlzaCBUeCBwYWNrZXQuIFVwZGF0ZSBmaXJzdCBkZXNjIGluIGNhc2Ugb2YgVHggcmVzb3VyY2UgZXJyb3IgKi8KKwkJcF90eF9kZXNjX2ZpcnN0ID0gcF90eF9uZXh0X2Rlc2NfY3VycjsKKwkJRklSU1RfVEZEX1NFVCAocF90eF9kZXNjX2ZpcnN0LCB0eF9xdWV1ZSk7CisKKwl9IGVsc2UgeworCQlwX3R4X2Rlc2NfY3Vyci0+Y21kX3N0cyA9IGNvbW1hbmRfc3RhdHVzOworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzY19jdXJyLCAwKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgcmluZyBpbmRleCBvdmVybGFwIGluIHRoZSBUeCBkZXNjIHJpbmcgKi8KKwlpZiAocF90eF9uZXh0X2Rlc2NfY3VyciA9PSBwX3R4X2Rlc2NfdXNlZCkgeworCQkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciAqLworCQlDVVJSX1RGRF9TRVQgKHBfdHhfZGVzY19maXJzdCwgdHhfcXVldWUpOworCisJCXBfZXRoX3BvcnRfY3RybC0+dHhfcmVzb3VyY2VfZXJyW3R4X3F1ZXVlXSA9IHRydWU7CisJCXJldHVybiBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRTsKKwl9IGVsc2UgeworCQkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgZGVzY3JpcHRvciAqLworCQlDVVJSX1RGRF9TRVQgKHBfdHhfbmV4dF9kZXNjX2N1cnIsIHR4X3F1ZXVlKTsKKwkJcmV0dXJuIEVUSF9PSzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhfdHhfcmV0dXJuX2Rlc2MgLSBGcmVlIGFsbCB1c2VkIFR4IGRlc2NyaXB0b3JzCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0IGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIuCisgKiAgICAgIEl0IHVzZXMgdGhlICdmaXJzdCcgaW5kZXggdG8gc3VwcG9ydCBUeCBkZXNjIHJldHVybiBpbiBjYXNlIGEgdHJhbnNtaXQKKyAqICAgICAgb2YgYSBwYWNrZXQgc3Bhbm5lZCBvdmVyIG11bHRpcGxlIGJ1ZmZlciBzdGlsbCBpbiBwcm9jZXNzLgorICogICAgICBJbiBjYXNlIHRoZSBUeCBxdWV1ZSB3YXMgaW4gInJlc291cmNlIGVycm9yIiBjb25kaXRpb24sIHdoZXJlIHRoZXJlIGFyZQorICogICAgICBubyBhdmFpbGFibGUgVHggcmVzb3VyY2VzLCB0aGUgZnVuY3Rpb24gcmVzZXRzIHRoZSByZXNvdXJjZSBlcnJvciBmbGFnLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlRfSU5GTyAgICpwX2V0aF9wb3J0X2N0cmwgICBFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJRVRIX1FVRVVFICAgCXR4X3F1ZXVlICAgICAgICAgTnVtYmVyIG9mIFR4IHF1ZXVlLgorICoJUEtUX0lORk8gICAgICAgICpwX3BrdF9pbmZvICAgICAgIFVzZXIgcGFja2V0IGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglUeCByaW5nICdmaXJzdCcgYW5kICd1c2VkJyBpbmRleGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFR4IGRlc2MgcmluZy4KKyAqICAgICAgRVRIX1JFVFJZIGluIGNhc2UgdGhlcmUgaXMgdHJhbnNtaXNzaW9uIGluIHByb2Nlc3MuCisgKglFVEhfRU5EX09GX0pPQiBpZiB0aGUgcm91dGluZSBoYXMgbm90aGluZyB0byByZWxlYXNlLgorICogICAgICBFVEhfT0sgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3R4X3JldHVybl9kZXNjIChFVEhfUE9SVF9JTkZPICoKKwkJCQkJICAgICAgIHBfZXRoX3BvcnRfY3RybCwKKwkJCQkJICAgICAgIEVUSF9RVUVVRSB0eF9xdWV1ZSwKKwkJCQkJICAgICAgIFBLVF9JTkZPICogcF9wa3RfaW5mbykKK3sKKwl2b2xhdGlsZSBFVEhfVFhfREVTQyAqcF90eF9kZXNjX3VzZWQgPSBOVUxMOworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2Rlc2NfZmlyc3QgPSBOVUxMOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCisJLyogR2V0IHRoZSBUeCBEZXNjIHJpbmcgaW5kZXhlcyAqLworCVVTRURfVEZEX0dFVCAocF90eF9kZXNjX3VzZWQsIHR4X3F1ZXVlKTsKKwlGSVJTVF9URkRfR0VUIChwX3R4X2Rlc2NfZmlyc3QsIHR4X3F1ZXVlKTsKKworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHBfdHhfZGVzY191c2VkID09IE5VTEwpCisJCXJldHVybiBFVEhfRVJST1I7CisKKwljb21tYW5kX3N0YXR1cyA9IHBfdHhfZGVzY191c2VkLT5jbWRfc3RzOworCisJLyogU3RpbGwgdHJhbnNtaXR0aW5nLi4uICovCisJaWYgKGNvbW1hbmRfc3RhdHVzICYgKEVUSF9CVUZGRVJfT1dORURfQllfRE1BKSkgeworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzY191c2VkLCAwKTsKKwkJcmV0dXJuIEVUSF9SRVRSWTsKKwl9CisKKwkvKiBTdG9wIHJlbGVhc2UuIEFib3V0IHRvIG92ZXJsYXAgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIFR4IGRlc2NyaXB0b3IgKi8KKwlpZiAoKHBfdHhfZGVzY191c2VkID09IHBfdHhfZGVzY19maXJzdCkgJiYKKwkgICAgKHBfZXRoX3BvcnRfY3RybC0+dHhfcmVzb3VyY2VfZXJyW3R4X3F1ZXVlXSA9PSBmYWxzZSkpIHsKKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2NfdXNlZCwgMCk7CisJCXJldHVybiBFVEhfRU5EX09GX0pPQjsKKwl9CisKKwkvKiBQYXNzIHRoZSBwYWNrZXQgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlciAqLworCXBfcGt0X2luZm8tPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1czsKKwlwX3BrdF9pbmZvLT5yZXR1cm5faW5mbyA9IHBfdHhfZGVzY191c2VkLT5yZXR1cm5faW5mbzsKKwlwX3R4X2Rlc2NfdXNlZC0+cmV0dXJuX2luZm8gPSAwOworCisJLyogVXBkYXRlIHRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gcmVsZWFzZS4gKi8KKwlVU0VEX1RGRF9TRVQgKFRYX05FWFRfREVTQ19QVFIgKHBfdHhfZGVzY191c2VkLCB0eF9xdWV1ZSksIHR4X3F1ZXVlKTsKKworCS8qIEFueSBUeCByZXR1cm4gY2FuY2VscyB0aGUgVHggcmVzb3VyY2UgZXJyb3Igc3RhdHVzICovCisJaWYgKHBfZXRoX3BvcnRfY3RybC0+dHhfcmVzb3VyY2VfZXJyW3R4X3F1ZXVlXSA9PSB0cnVlKQorCQlwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2Vyclt0eF9xdWV1ZV0gPSBmYWxzZTsKKworCURfQ0FDSEVfRkxVU0hfTElORSAoKHVuc2lnbmVkIGludCkgcF90eF9kZXNjX3VzZWQsIDApOworCisJcmV0dXJuIEVUSF9PSzsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfcmVjZWl2ZSAtIEdldCByZWNlaXZlZCBpbmZvcm1hdGlvbiBmcm9tIFJ4IHJpbmcuCisgKgorICogREVTQ1JJUFRJT046CisgKiAJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHJlY2VpdmVkIGRhdGEgdG8gdGhlIGNhbGxlci4gVGhlcmUgaXMgbm8KKyAqCWRhdGEgY29weWluZyBkdXJpbmcgcm91dGluZSBvcGVyYXRpb24uIEFsbCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZAorICoJdXNpbmcgcG9pbnRlciB0byBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0IHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIuCisgKiAgICAgIElmIHRoZSByb3V0aW5lIGV4aGF1c3RzCVJ4IHJpbmcgcmVzb3VyY2VzIHRoZW4gdGhlIHJlc291cmNlIGVycm9yIGZsYWcKKyAqICAgICAgaXMgc2V0LgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlRfSU5GTyAgICpwX2V0aF9wb3J0X2N0cmwgICBFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJRVRIX1FVRVVFICAgCXJ4X3F1ZXVlICAgICAgICAgTnVtYmVyIG9mIFJ4IHF1ZXVlLgorICoJUEtUX0lORk8gICAgICAgICpwX3BrdF9pbmZvICAgICAgIFVzZXIgcGFja2V0IGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglSeCByaW5nIGN1cnJlbnQgYW5kIHVzZWQgaW5kZXhlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBSRVRVUk46CisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBSeCBkZXNjIHJpbmcuCisgKglFVEhfUVVFVUVfRlVMTCBpZiBSeCByaW5nIHJlc291cmNlcyBhcmUgZXhoYXVzdGVkLgorICoJRVRIX0VORF9PRl9KT0IgaWYgdGhlcmUgaXMgbm8gcmVjZWl2ZWQgZGF0YS4KKyAqICAgICAgRVRIX09LIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3JlY2VpdmUgKEVUSF9QT1JUX0lORk8gKiBwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgRVRIX1FVRVVFIHJ4X3F1ZXVlLAorCQkJCQkgICAgIFBLVF9JTkZPICogcF9wa3RfaW5mbykKK3sKKwl2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF9yeF9jdXJyX2Rlc2M7CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfbmV4dF9jdXJyX2Rlc2M7CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfdXNlZF9kZXNjOworCXVuc2lnbmVkIGludCBjb21tYW5kX3N0YXR1czsKKworCS8qIERvIG5vdCBwcm9jZXNzIFJ4IHJpbmcgaW4gY2FzZSBvZiBSeCByaW5nIHJlc291cmNlIGVycm9yICovCisJaWYgKHBfZXRoX3BvcnRfY3RybC0+cnhfcmVzb3VyY2VfZXJyW3J4X3F1ZXVlXSA9PSB0cnVlKSB7CisJCXByaW50ZiAoIlxuUnggUXVldWUgaXMgZnVsbCAuLi5cbiIpOworCQlyZXR1cm4gRVRIX1FVRVVFX0ZVTEw7CisJfQorCisJLyogR2V0IHRoZSBSeCBEZXNjIHJpbmcgJ2N1cnIgYW5kICd1c2VkJyBpbmRleGVzICovCisJQ1VSUl9SRkRfR0VUIChwX3J4X2N1cnJfZGVzYywgcnhfcXVldWUpOworCVVTRURfUkZEX0dFVCAocF9yeF91c2VkX2Rlc2MsIHJ4X3F1ZXVlKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChwX3J4X2N1cnJfZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gRVRIX0VSUk9SOworCisJLyogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIHNhdmUgcmVhZGluZ3MgZnJvbSBtZW1vcnkgKi8KKwlwX3J4X25leHRfY3Vycl9kZXNjID0gUlhfTkVYVF9ERVNDX1BUUiAocF9yeF9jdXJyX2Rlc2MsIHJ4X3F1ZXVlKTsKKwljb21tYW5kX3N0YXR1cyA9IHBfcnhfY3Vycl9kZXNjLT5jbWRfc3RzOworCisJLyogTm90aGluZyB0byByZWNlaXZlLi4uICovCisJaWYgKGNvbW1hbmRfc3RhdHVzICYgKEVUSF9CVUZGRVJfT1dORURfQllfRE1BKSkgeworLyogCURQKHByaW50ZigiUng6IGNvbW1hbmRfc3RhdHVzOiAlMDh4XG4iLCBjb21tYW5kX3N0YXR1cykpOyAqLworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfcnhfY3Vycl9kZXNjLCAwKTsKKy8qCURQKHByaW50ZigiXG5FVEhfRU5EX09GX0pPQiAuLi5cbiIpKTsqLworCQlyZXR1cm4gRVRIX0VORF9PRl9KT0I7CisJfQorCisJcF9wa3RfaW5mby0+Ynl0ZV9jbnQgPSAocF9yeF9jdXJyX2Rlc2MtPmJ5dGVfY250KSAtIFJYX0JVRl9PRkZTRVQ7CisJcF9wa3RfaW5mby0+Y21kX3N0cyA9IGNvbW1hbmRfc3RhdHVzOworCXBfcGt0X2luZm8tPmJ1Zl9wdHIgPSAocF9yeF9jdXJyX2Rlc2MtPmJ1Zl9wdHIpICsgUlhfQlVGX09GRlNFVDsKKwlwX3BrdF9pbmZvLT5yZXR1cm5faW5mbyA9IHBfcnhfY3Vycl9kZXNjLT5yZXR1cm5faW5mbzsKKwlwX3BrdF9pbmZvLT5sNGlfY2hrID0gcF9yeF9jdXJyX2Rlc2MtPmJ1Zl9zaXplOwkvKiBJUCBmcmFnbWVudCBpbmRpY2F0b3IgKi8KKworCS8qIENsZWFuIHRoZSByZXR1cm4gaW5mbyBmaWVsZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYWNrZXQgaGFzIGJlZW4gKi8KKwkvKiBtb3ZlZCB0byB0aGUgdXBwZXIgbGF5ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJcF9yeF9jdXJyX2Rlc2MtPnJldHVybl9pbmZvID0gMDsKKworCS8qIFVwZGF0ZSAnY3VycicgaW4gZGF0YSBzdHJ1Y3R1cmUgKi8KKwlDVVJSX1JGRF9TRVQgKHBfcnhfbmV4dF9jdXJyX2Rlc2MsIHJ4X3F1ZXVlKTsKKworCS8qIFJ4IGRlc2NyaXB0b3JzIHJlc291cmNlIGV4aGF1c3RlZC4gU2V0IHRoZSBSeCByaW5nIHJlc291cmNlIGVycm9yIGZsYWcgKi8KKwlpZiAocF9yeF9uZXh0X2N1cnJfZGVzYyA9PSBwX3J4X3VzZWRfZGVzYykKKwkJcF9ldGhfcG9ydF9jdHJsLT5yeF9yZXNvdXJjZV9lcnJbcnhfcXVldWVdID0gdHJ1ZTsKKworCURfQ0FDSEVfRkxVU0hfTElORSAoKHVuc2lnbmVkIGludCkgcF9yeF9jdXJyX2Rlc2MsIDApOworCUNQVV9QSVBFX0ZMVVNIOworCXJldHVybiBFVEhfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhfcnhfcmV0dXJuX2J1ZmYgLSBSZXR1cm5zIGEgUnggYnVmZmVyIGJhY2sgdG8gdGhlIFJ4IHJpbmcuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyBhIFJ4IGJ1ZmZlciBiYWNrIHRvIHRoZSBSeCByaW5nLiBJdCByZXRyaWV2ZXMgdGhlCisgKiAgICAgIG5leHQgJ3VzZWQnIGRlc2NyaXB0b3IgYW5kIGF0dGFjaGVkIHRoZSByZXR1cm5lZCBidWZmZXIgdG8gaXQuCisgKiAgICAgIEluIGNhc2UgdGhlIFJ4IHJpbmcgd2FzIGluICJyZXNvdXJjZSBlcnJvciIgY29uZGl0aW9uLCB3aGVyZSB0aGVyZSBhcmUKKyAqICAgICAgbm8gYXZhaWxhYmxlIFJ4IHJlc291cmNlcywgdGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVzb3VyY2UgZXJyb3IgZmxhZy4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAlyeF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBSeCBxdWV1ZS4KKyAqICAgICAgUEtUX0lORk8gICAgICAgICpwX3BrdF9pbmZvICAgICAgIEluZm9ybWF0aW9uIG9uIHRoZSByZXR1cm5lZCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJTmV3IGF2YWlsYWJsZSBSeCByZXNvdXJjZSBpbiBSeCBkZXNjcmlwdG9yIHJpbmcuCisgKgorICogUkVUVVJOOgorICoJRVRIX0VSUk9SIGluIGNhc2UgdGhlIHJvdXRpbmUgY2FuIG5vdCBhY2Nlc3MgUnggZGVzYyByaW5nLgorICogICAgICBFVEhfT0sgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3J4X3JldHVybl9idWZmIChFVEhfUE9SVF9JTkZPICoKKwkJCQkJICAgICAgIHBfZXRoX3BvcnRfY3RybCwKKwkJCQkJICAgICAgIEVUSF9RVUVVRSByeF9xdWV1ZSwKKwkJCQkJICAgICAgIFBLVF9JTkZPICogcF9wa3RfaW5mbykKK3sKKwl2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF91c2VkX3J4X2Rlc2M7CS8qIFdoZXJlIHRvIHJldHVybiBSeCByZXNvdXJjZSAqLworCisJLyogR2V0ICd1c2VkJyBSeCBkZXNjcmlwdG9yICovCisJVVNFRF9SRkRfR0VUIChwX3VzZWRfcnhfZGVzYywgcnhfcXVldWUpOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHBfdXNlZF9yeF9kZXNjID09IE5VTEwpCisJCXJldHVybiBFVEhfRVJST1I7CisKKwlwX3VzZWRfcnhfZGVzYy0+YnVmX3B0ciA9IHBfcGt0X2luZm8tPmJ1Zl9wdHI7CisJcF91c2VkX3J4X2Rlc2MtPnJldHVybl9pbmZvID0gcF9wa3RfaW5mby0+cmV0dXJuX2luZm87CisJcF91c2VkX3J4X2Rlc2MtPmJ5dGVfY250ID0gcF9wa3RfaW5mby0+Ynl0ZV9jbnQ7CisJcF91c2VkX3J4X2Rlc2MtPmJ1Zl9zaXplID0gTVY2NDM2MF9SWF9CVUZGRVJfU0laRTsJLyogUmVzZXQgQnVmZmVyIHNpemUgKi8KKworCS8qIEZsdXNoIHRoZSB3cml0ZSBwaXBlICovCisJQ1BVX1BJUEVfRkxVU0g7CisKKwkvKiBSZXR1cm4gdGhlIGRlc2NyaXB0b3IgdG8gRE1BIG93bmVyc2hpcCAqLworCXBfdXNlZF9yeF9kZXNjLT5jbWRfc3RzID0KKwkJRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEgfCBFVEhfUlhfRU5BQkxFX0lOVEVSUlVQVDsKKworCS8qIEZsdXNoIGRlc2NyaXB0b3IgYW5kIENQVSBwaXBlICovCisJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3VzZWRfcnhfZGVzYywgMCk7CisJQ1BVX1BJUEVfRkxVU0g7CisKKwkvKiBNb3ZlIHRoZSB1c2VkIGRlc2NyaXB0b3IgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yICovCisJVVNFRF9SRkRfU0VUIChSWF9ORVhUX0RFU0NfUFRSIChwX3VzZWRfcnhfZGVzYywgcnhfcXVldWUpLCByeF9xdWV1ZSk7CisKKwkvKiBBbnkgUnggcmV0dXJuIGNhbmNlbHMgdGhlIFJ4IHJlc291cmNlIGVycm9yIHN0YXR1cyAqLworCWlmIChwX2V0aF9wb3J0X2N0cmwtPnJ4X3Jlc291cmNlX2VycltyeF9xdWV1ZV0gPT0gdHJ1ZSkKKwkJcF9ldGhfcG9ydF9jdHJsLT5yeF9yZXNvdXJjZV9lcnJbcnhfcXVldWVdID0gZmFsc2U7CisKKwlyZXR1cm4gRVRIX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3BvcnRfc2V0X3J4X2NvYWwgLSBTZXRzIGNvYWxlc2NpbmcgaW50ZXJydXB0IG1lY2hhbmlzbSBvbiBSWCBwYXRoCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgc2V0cyB0aGUgUlggY29hbGVzY2luZyBpbnRlcnJ1cHQgbWVjaGFuaXNtIHBhcmFtZXRlci4KKyAqCVRoaXMgcGFyYW1ldGVyIGlzIGEgdGltZW91dCBjb3VudGVyLCB0aGF0IGNvdW50cyBpbiA2NCB0X2NsaworICoJY2h1bmtzIDsgdGhhdCB3aGVuIHRpbWVvdXQgZXZlbnQgb2NjdXJzIGEgbWFza2FibGUgaW50ZXJydXB0CisgKglvY2N1cnMuCisgKglUaGUgcGFyYW1ldGVyIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHRDbGsgb2YgdGhlIE1WLTY0M3h4IGNoaXAKKyAqCSwgYW5kIHRoZSByZXF1aXJlZCBkZWxheSBvZiB0aGUgaW50ZXJydXB0IGluIHVzZWMuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCBldGhfcG9ydF9udW0gICAgICBFdGhlcm5ldCBwb3J0IG51bWJlcgorICoJdW5zaWduZWQgaW50IHRfY2xrICAgICAgICB0X2NsayBvZiB0aGUgTVYtNjQzeHggY2hpcCBpbiBIWiB1bml0cworICoJdW5zaWduZWQgaW50IGRlbGF5ICAgICAgIERlbGF5IGluIHVzZWMKKyAqCisgKiBPVVRQVVQ6CisgKglJbnRlcnJ1cHQgY29hbGVzY2luZyBtZWNoYW5pc20gdmFsdWUgaXMgc2V0IGluIE1WLTY0M3h4IGNoaXAuCisgKgorICogUkVUVVJOOgorICoJVGhlIGludGVycnVwdCBjb2FsZXNjaW5nIHZhbHVlIHNldCBpbiB0aGUgZ2lnRSBwb3J0LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIDAJCQkJLyogRklYTUUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoX3BvcnRfc2V0X3J4X2NvYWwgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgdF9jbGssCisJCQkJCSAgdW5zaWduZWQgaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGludCBjb2FsOworCisJY29hbCA9ICgodF9jbGsgLyAxMDAwMDAwKSAqIGRlbGF5KSAvIDY0OworCS8qIFNldCBSWCBDb2FsZXNjaW5nIG1lY2hhbmlzbSAqLworCU1WX1JFR19XUklURSAoTVY2NDM2MF9FVEhfU0RNQV9DT05GSUdfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICAoKGNvYWwgJiAweDNmZmYpIDw8IDgpIHwKKwkJICAgICAgKE1WX1JFR19SRUFECisJCSAgICAgICAoTVY2NDM2MF9FVEhfU0RNQV9DT05GSUdfUkVHIChldGhfcG9ydF9udW0pKQorCQkgICAgICAgJiAweGZmYzAwMGZmKSk7CisJcmV0dXJuIGNvYWw7Cit9CisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3NldF90eF9jb2FsIC0gU2V0cyBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gb24gVFggcGF0aAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIFRYIGNvYWxlc2NpbmcgaW50ZXJydXB0IG1lY2hhbmlzbSBwYXJhbWV0ZXIuCisgKglUaGlzIHBhcmFtZXRlciBpcyBhIHRpbWVvdXQgY291bnRlciwgdGhhdCBjb3VudHMgaW4gNjQgdF9jbGsKKyAqCWNodW5rcyA7IHRoYXQgd2hlbiB0aW1lb3V0IGV2ZW50IG9jY3VycyBhIG1hc2thYmxlIGludGVycnVwdAorICoJb2NjdXJzLgorICoJVGhlIHBhcmFtZXRlciBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSB0X2NMSyBmcmVxdWVuY3kgb2YgdGhlCisgKglNVi02NDN4eCBjaGlwIGFuZCB0aGUgcmVxdWlyZWQgZGVsYXkgaW4gdGhlIGludGVycnVwdCBpbiB1U2VjCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCBldGhfcG9ydF9udW0gICAgICBFdGhlcm5ldCBwb3J0IG51bWJlcgorICoJdW5zaWduZWQgaW50IHRfY2xrICAgICAgICB0X2NsayBvZiB0aGUgTVYtNjQzeHggY2hpcCBpbiBIWiB1bml0cworICoJdW5zaWduZWQgaW50IGRlbGF5ICAgICAgIERlbGF5IGluIHVTZWNvbmRzCisgKgorICogT1VUUFVUOgorICoJSW50ZXJydXB0IGNvYWxlc2NpbmcgbWVjaGFuaXNtIHZhbHVlIGlzIHNldCBpbiBNVi02NDN4eCBjaGlwLgorICoKKyAqIFJFVFVSTjoKKyAqCVRoZSBpbnRlcnJ1cHQgY29hbGVzY2luZyB2YWx1ZSBzZXQgaW4gdGhlIGdpZ0UgcG9ydC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCQkJCS8qIEZJWE1FICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aF9wb3J0X3NldF90eF9jb2FsIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJCSAgdW5zaWduZWQgaW50IHRfY2xrLAorCQkJCQkgIHVuc2lnbmVkIGludCBkZWxheSkKK3sKKwl1bnNpZ25lZCBpbnQgY29hbDsKKworCWNvYWwgPSAoKHRfY2xrIC8gMTAwMDAwMCkgKiBkZWxheSkgLyA2NDsKKwkvKiBTZXQgVFggQ29hbGVzY2luZyBtZWNoYW5pc20gKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQzNjBfRVRIX1RYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRF9SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIGNvYWwgPDwgNCk7CisJcmV0dXJuIGNvYWw7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9iX2NvcHkgLSBDb3B5IGJ5dGVzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBlaWdodCBieXRlcyBsaW1pdGF0aW9uIG9uIFR4IGJ1ZmZlciBzaXplLgorICogICAgICAgVGhlIHJvdXRpbmUgd2lsbCB6ZXJvIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGZyb20gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqICAgICAgIGZvbGxvd2VkIGJ5IGNvcHlpbmcgYnl0ZXMgZnJvbSB0aGUgc291cmNlIGFkZHJlc3MgdG8gdGhlIGRlc3RpbmF0aW9uLgorICoKKyAqIElOUFVUOgorICogICAgICAgdW5zaWduZWQgaW50IHNyY19hZGRyICAgIDMyIGJpdCBzb3VyY2UgYWRkcmVzcy4KKyAqICAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkciAgICAzMiBiaXQgZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqICAgICAgIGludCAgICAgICAgYnl0ZV9jb3VudCAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgICBTZWUgZGVzY3JpcHRpb24uCisgKgorICogUkVUVVJOOgorICogICAgICAgTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9iX2NvcHkgKHVuc2lnbmVkIGludCBzcmNfYWRkciwgdW5zaWduZWQgaW50IGRzdF9hZGRyLAorCQkJaW50IGJ5dGVfY291bnQpCit7CisJLyogWmVybyB0aGUgZHN0X2FkZHIgYXJlYSAqLworCSoodW5zaWduZWQgaW50ICopIGRzdF9hZGRyID0gMHgwOworCisJd2hpbGUgKGJ5dGVfY291bnQgIT0gMCkgeworCQkqKGNoYXIgKikgZHN0X2FkZHIgPSAqKGNoYXIgKikgc3JjX2FkZHI7CisJCWRzdF9hZGRyKys7CisJCXNyY19hZGRyKys7CisJCWJ5dGVfY291bnQtLTsKKwl9Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvbXZfZXRoLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvbXZfZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZDMwYgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9tdl9ldGguaApAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqIGJhc2VkIG9uIC0gRHJpdmVyIGZvciBNVjY0MzYwWCBldGhlcm5ldCBwb3J0cworICogQ29weXJpZ2h0IChDKSAyMDAyIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIG12X2V0aC5oIC0gaGVhZGVyIGZpbGUgZm9yIHRoZSBwb2xsZWQgbW9kZSBHVCBldGhlcm5ldCBkcml2ZXIKKyAqLworCisjaWZuZGVmIF9fREI2NDM2MF9FVEhfSF9fCisjZGVmaW5lIF9fREI2NDM2MF9FVEhfSF9fCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bmV0Lmg+CisjaW5jbHVkZSAibXZfcmVncy5oIgorI2luY2x1ZGUgIi4uL2NvbW1vbi9wcGNfZXJyb3Jfbm8uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBUaGUgZmlyc3QgcGFydCBpcyB0aGUgaGlnaCBsZXZlbCBkcml2ZXIgb2YgdGhlIGdpZ0UgZXRoZXJuZXQgcG9ydHMuCSAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKyNpZm5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgMAorI2VuZGlmCisKKy8qIEluIGNhc2Ugbm90IHVzaW5nIFNHIG9uIFR4LCBkZWZpbmUgTUFYX1NLQl9GUkFHUyBhcyAwICovCisjaWZuZGVmIE1BWF9TS0JfRlJBR1MKKyNkZWZpbmUgTUFYX1NLQl9GUkFHUyAwCisjZW5kaWYKKworLyogUG9ydCBhdHRyaWJ1dGVzICovCisvKiNkZWZpbmUgTUFYX1JYX1FVRVVFX05VTQk4Ki8KKy8qI2RlZmluZSBNQVhfVFhfUVVFVUVfTlVNCTgqLworI2RlZmluZSBNQVhfUlhfUVVFVUVfTlVNCTEKKyNkZWZpbmUgTUFYX1RYX1FVRVVFX05VTQkxCisKKworLyogVXNlIG9uZSBUWCBxdWV1ZSBhbmQgb25lIFJYIHF1ZXVlICovCisjZGVmaW5lIE1WNjQzNjBfVFhfUVVFVUVfTlVNIDEKKyNkZWZpbmUgTVY2NDM2MF9SWF9RVUVVRV9OVU0gMQorCisvKgorICogTnVtYmVyIG9mIFJYIC8gVFggZGVzY3JpcHRvcnMgb24gUlggLyBUWCByaW5ncy4KKyAqIE5vdGUgdGhhdCBhbGxvY2F0aW5nIFJYIGRlc2NyaXB0b3JzIGlzIGRvbmUgYnkgYWxsb2NhdGluZyB0aGUgUlgKKyAqIHJpbmcgQU5EIGEgcHJlYWxsb2NhdGVkIFJYIGJ1ZmZlcnMgKHNrYidzKSBmb3IgZWFjaCBkZXNjcmlwdG9yLgorICogVGhlIFRYIGRlc2NyaXB0b3JzIG9ubHkgYWxsb2NhdGVzIHRoZSBUWCBkZXNjcmlwdG9ycyByaW5nLAorICogd2l0aCBubyBwcmUgYWxsb2NhdGVkIFRYIGJ1ZmZlcnMgKHNrYidzIGFyZSBhbGxvY2F0ZWQgYnkgaGlnaGVyIGxheWVycy4KKyAqLworCisvKiBEZWZhdWx0IFRYIHJpbmcgc2l6ZSBpcyAxMCBkZXNjcmlwdG9ycyAqLworI2lmZGVmIENPTkZJR19NVjY0MzYwX0VUSF9UWFFVRVVFX1NJWkUKKyNkZWZpbmUgTVY2NDM2MF9UWF9RVUVVRV9TSVpFIENPTkZJR19NVjY0MzYwX0VUSF9UWFFVRVVFX1NJWkUKKyNlbHNlCisjZGVmaW5lIE1WNjQzNjBfVFhfUVVFVUVfU0laRSA0CisjZW5kaWYKKworLyogRGVmYXVsdCBSWCByaW5nIHNpemUgaXMgNCBkZXNjcmlwdG9ycyAqLworI2lmZGVmCUNPTkZJR19NVjY0MzYwX0VUSF9SWFFVRVVFX1NJWkUKKyNkZWZpbmUgTVY2NDM2MF9SWF9RVUVVRV9TSVpFIENPTkZJR19NVjY0MzYwX0VUSF9SWFFVRVVFX1NJWkUKKyNlbHNlCisjZGVmaW5lIE1WNjQzNjBfUlhfUVVFVUVfU0laRSA0CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SWF9CVUZGRVJfU0laRQorI2RlZmluZSBNVjY0MzYwX1JYX0JVRkZFUl9TSVpFIENPTkZJR19SWF9CVUZGRVJfU0laRQorI2Vsc2UKKyNkZWZpbmUgTVY2NDM2MF9SWF9CVUZGRVJfU0laRSAxNjAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19UWF9CVUZGRVJfU0laRQorI2RlZmluZSBNVjY0MzYwX1RYX0JVRkZFUl9TSVpFIENPTkZJR19UWF9CVUZGRVJfU0laRQorI2Vsc2UKKyNkZWZpbmUgTVY2NDM2MF9UWF9CVUZGRVJfU0laRSAxNjAwCisjZW5kaWYKKworCisvKgorICoJTmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcy4gQWtpbiB0byB0aGUgMi4wIGV0aGVyIHN0YXRzIGJ1dAorICoJd2l0aCBieXRlIGNvdW50ZXJzLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCit7CisJdW5zaWduZWQgbG9uZwlyeF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZAkqLworCXVuc2lnbmVkIGxvbmcJdHhfcGFja2V0czsJCS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQJCSovCisJdW5zaWduZWQgbG9uZwl0eF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkCSovCisJdW5zaWduZWQgbG9uZwlyeF9lcnJvcnM7CQkvKiBiYWQgcGFja2V0cyByZWNlaXZlZAkJKi8KKwl1bnNpZ25lZCBsb25nCXR4X2Vycm9yczsJCS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcwkqLworCXVuc2lnbmVkIGxvbmcJcnhfZHJvcHBlZDsJCS8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMJKi8KKwl1bnNpZ25lZCBsb25nCXR4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXgJKi8KKwl1bnNpZ25lZCBsb25nCW11bHRpY2FzdDsJCS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkCSovCisJdW5zaWduZWQgbG9uZwljb2xsaXNpb25zOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworCXVuc2lnbmVkIGxvbmcJcnhfbGVuZ3RoX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXJ4X292ZXJfZXJyb3JzOwkJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93CSovCisJdW5zaWduZWQgbG9uZwlyeF9jcmNfZXJyb3JzOwkJLyogcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvcgkqLworCXVuc2lnbmVkIGxvbmcJcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJdW5zaWduZWQgbG9uZwlyeF9maWZvX2Vycm9yczsJCS8qIHJlY3YnciBmaWZvIG92ZXJydW4JCSovCisJdW5zaWduZWQgbG9uZwlyeF9taXNzZWRfZXJyb3JzOwkvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0CSovCisKKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nCXR4X2Fib3J0ZWRfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJdHhfY2Fycmllcl9lcnJvcnM7CisJdW5zaWduZWQgbG9uZwl0eF9maWZvX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZwl0eF93aW5kb3dfZXJyb3JzOworCisJLyogZm9yIGNzbGlwIGV0YyAqLworCXVuc2lnbmVkIGxvbmcJcnhfY29tcHJlc3NlZDsKKwl1bnNpZ25lZCBsb25nCXR4X2NvbXByZXNzZWQ7Cit9OworCisKKy8qIFByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgZXRoZXJuZXQgZGV2aWNlICovCitzdHJ1Y3QgbXY2NDM2MF9ldGhfcHJpdiB7CisgICAgdW5zaWduZWQgaW50IHBvcnRfbnVtOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKworLyogdG8gYnVmZmVyIGFyZWEgYWxpZ25lZCAqLworICAgIGNoYXIgKiBwX2V0aF90eF9idWZmZXJbTVY2NDM2MF9UWF9RVUVVRV9TSVpFKzFdOwkvKnBvaW50ZXJzIHRvIGFsbGlnbmVkIHR4IGJ1ZmZzIGluIG1lbW9yeSBzcGFjZSAqLworICAgIGNoYXIgKiBwX2V0aF9yeF9idWZmZXJbTVY2NDM2MF9SWF9RVUVVRV9TSVpFKzFdOwkvKnBvaW50ZXJzIHRvIGFsbGluZ2VkIHJ4IGJ1ZmZzIGluIG1lbW9yeSBzcGFjZSAqLworCisgICAgLyogU2l6ZSBvZiBUeCBSaW5nIHBlciBxdWV1ZSAqLworICAgIHVuc2lnbmVkIGludCB0eF9yaW5nX3NpemUgW01BWF9UWF9RVUVVRV9OVU1dOworCisKKyAgICAvKiBTaXplIG9mIFJ4IFJpbmcgcGVyIHF1ZXVlICovCisgICAgdW5zaWduZWQgaW50IHJ4X3Jpbmdfc2l6ZSBbTUFYX1JYX1FVRVVFX05VTV07CisKKyAgICAvKiBNYWdpYyBOdW1iZXIgZm9yIEV0aGVybmV0IHJ1bm5pbmcgKi8KKyAgICB1bnNpZ25lZCBpbnQgZXRoX3J1bm5pbmc7CisKK307CisKKworaW50IG12NjQzNjBfZXRoX2luaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworaW50IG12NjQzNjBfZXRoX3N0b3AgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworaW50IG12NjQzNjBfZXRoX3N0YXJ0X3htaXQgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFja2V0LCBpbnQgbGVuZ3RoKTsKKy8qCXJldHVybiBkYjY0MzYwX2V0aDBfcG9sbCgpOyAqLworCitpbnQgbXY2NDM2MF9ldGhfb3BlbiAoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVhZGVyIEZpbGUgZm9yIDogTVYtNjQzeHggbmV0d29yayBpbnRlcmZhY2UgaGVhZGVyCisgKgorICogREVTQ1JJUFRJT046CisgKgkgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBtYWNyb3MgdHlwZWRlZnMgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvcgorICoJIHRoZSBNYXJ2ZWxsIEdpZyBCaXQgRXRoZXJuZXQgQ29udHJvbGxlci4KKyAqCisgKiBERVBFTkRFTkNJRVM6CisgKgkgTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgQ09ORklHX1NQRUNJQUxfQ09OU0lTVEVOVF9NRU1PUlkKKyNpZmRlZiBDT05GSUdfTVY2NDM2MF9TUkFNX0NBQ0hFQUJMRQorLyogSW4gY2FzZSBTUkFNIGlzIGNhY2hlYWJsZSBidXQgbm90IGNhY2hlIGNvaGVyZW50ICovCisjZGVmaW5lIERfQ0FDSEVfRkxVU0hfTElORShhZGRyLCBvZmZzZXQpICAgICAgIFwKK3sJCSAgICBcCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZGNiZiAlMCwlMSIgOiA6ICJyIiAoYWRkciksICJyIiAob2Zmc2V0KSk7IFwKK30KKyNlbHNlCisvKiBJbiBjYXNlIFNSQU0gaXMgY2FjaGUgY29oZXJlbnQgb3Igbm9uLWNhY2hlYWJsZSAqLworI2RlZmluZSBEX0NBQ0hFX0ZMVVNIX0xJTkUoYWRkciwgb2Zmc2V0KSA7CisjZW5kaWYKKyNlbHNlCisjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorLyogSW4gY2FzZSBvZiBkZXNjcmlwdG9ycyBvbiBERFIgYnV0IG5vdCBjYWNoZSBjb2hlcmVudCAqLworI2RlZmluZSBEX0NBQ0hFX0ZMVVNIX0xJTkUoYWRkciwgb2Zmc2V0KSAgICAgICBcCit7CQkgICAgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRjYmYgJTAsJTEiIDogOiAiciIgKGFkZHIpLCAiciIgKG9mZnNldCkpOyBcCit9CisjZWxzZQorLyogSW4gY2FzZSBvZiBkZXNjcmlwdG9ycyBvbiBERFIgYW5kIGNhY2hlIGNvaGVyZW50ICovCisjZGVmaW5lIERfQ0FDSEVfRkxVU0hfTElORShhZGRyLCBvZmZzZXQpIDsKKyNlbmRpZiAvKiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCisjZW5kaWYgLyogQ09ORklHX1NQRUNJQUxfQ09OU0lTVEVOVF9NRU1PUlkgKi8KKworCisjZGVmaW5lIENQVV9QSVBFX0ZMVVNICQkgICBcCit7CQkgIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOwkgIFwKK30KKworCisvKiBkZWZpbmVzICAqLworCisvKiBEZWZhdWx0IHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZSAqLworI2RlZmluZSBQT1JUX0NPTkZJR19WQUxVRQkJCVwKKwkgICAgIEVUSF9VTklDQVNUX05PUk1BTF9NT0RFCQl8ICAgXAorCSAgICAgRVRIX0RFRkFVTFRfUlhfUVVFVUVfMAkJfCAgIFwKKwkgICAgIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV8wCQl8ICAgXAorCSAgICAgRVRIX1JFQ0VJVkVfQkNfSUZfTk9UX0lQX09SX0FSUAl8ICAgXAorCSAgICAgRVRIX1JFQ0VJVkVfQkNfSUZfSVAJCXwgICBcCisJICAgICBFVEhfUkVDRUlWRV9CQ19JRl9BUlAJCXwgICBcCisJICAgICBFVEhfQ0FQVFVSRV9UQ1BfRlJBTUVTX0RJUwkJfCAgIFwKKwkgICAgIEVUSF9DQVBUVVJFX1VEUF9GUkFNRVNfRElTCQl8ICAgXAorCSAgICAgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzAJCXwgICBcCisJICAgICBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMAkJfCAgIFwKKwkgICAgIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMAorCisvKiBEZWZhdWx0IHBvcnQgZXh0ZW5kIGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KKyNkZWZpbmUgUE9SVF9DT05GSUdfRVhURU5EX1ZBTFVFCQlcCisJICAgICBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfQVNfTk9STUFMCXwgICBcCisJICAgICBFVEhfUEFSVElUSU9OX0RJU0FCTEUKKworCisvKiBEZWZhdWx0IHNkbWEgY29udHJvbCB2YWx1ZSAqLworI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKyNkZWZpbmUgUE9SVF9TRE1BX0NPTkZJR19WQUxVRQkJCQlcCisJCQkgRVRIX1JYX0JVUlNUX1NJWkVfMTZfNjRCSVQJfAlcCisJCQkgR1RfRVRIX0lQR19JTlRfUlgoMCkJCQl8CVwKKwkJCSBFVEhfVFhfQlVSU1RfU0laRV8xNl82NEJJVDsKKyNlbHNlCisjZGVmaW5lIFBPUlRfU0RNQV9DT05GSUdfVkFMVUUJCQlcCisJCQkgRVRIX1JYX0JVUlNUX1NJWkVfNF82NEJJVAl8CVwKKwkJCSBHVF9FVEhfSVBHX0lOVF9SWCgwKQkJCXwJXAorCQkJIEVUSF9UWF9CVVJTVF9TSVpFXzRfNjRCSVQ7CisjZW5kaWYKKworI2RlZmluZSBHVF9FVEhfSVBHX0lOVF9SWCh2YWx1ZSkJCVwKKwkgICAgKCh2YWx1ZSAmIDB4M2ZmZikgPDwgOCkKKworLyogRGVmYXVsdCBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlICovCisjZGVmaW5lIFBPUlRfU0VSSUFMX0NPTlRST0xfVkFMVUUJCQkgICAgXAorCQkJRVRIX0ZPUkNFX0xJTktfUEFTUwkJCXwJXAorCQkJRVRIX0VOQUJMRV9BVVRPX05FR19GT1JfRFVQTFgJCXwJXAorCQkJRVRIX0RJU0FCTEVfQVVUT19ORUdfRk9SX0ZMT1dfQ1RSTAl8CVwKKwkJCUVUSF9BRFZfU1lNTUVUUklDX0ZMT1dfQ1RSTAkJfAlcCisJCQlFVEhfRk9SQ0VfRkNfTU9ERV9OT19QQVVTRV9ESVNfVFgJfAlcCisJCQlFVEhfRk9SQ0VfQlBfTU9ERV9OT19KQU0JCXwJXAorCQkJQklUOQkJCQkJfAlcCisJCQlFVEhfRE9fTk9UX0ZPUkNFX0xJTktfRkFJTAkJfAlcCisJCQlFVEhfUkVUUkFOU01JVF8xNl9FVFRFTVBUUwkJfAlcCisJCQlFVEhfRU5BQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkJCXwJXAorCQkJRVRIX0RURV9BRFZfMAkJCQl8CVwKKwkJCUVUSF9ESVNBQkxFX0FVVE9fTkVHX0JZUEFTUwkJfAlcCisJCQlFVEhfQVVUT19ORUdfTk9fQ0hBTkdFCQkJfAlcCisJCQlFVEhfTUFYX1JYX1BBQ0tFVF8xNTUyQllURQkJfAlcCisJCQlFVEhfQ0xSX0VYVF9MT09QQkFDSwkJCXwJXAorCQkJRVRIX1NFVF9GVUxMX0RVUExFWF9NT0RFCQl8CVwKKwkJCUVUSF9FTkFCTEVfRkxPV19DVFJMX1RYX1JYX0lOX0ZVTExfRFVQTEVYOworCisjZGVmaW5lIFJYX0JVRkZFUl9NQVhfU0laRSAgMHhGRkZGCisjZGVmaW5lIFRYX0JVRkZFUl9NQVhfU0laRSAgMHhGRkZGICAgLyogQnVmZmVyIGFyZSBsaW1pdGVkIHRvIDY0ayAqLworCisjZGVmaW5lIFJYX0JVRkZFUl9NSU5fU0laRSAgMHg4CisjZGVmaW5lIFRYX0JVRkZFUl9NSU5fU0laRSAgMHg4CisKKy8qIFR4IFdSUiBjb25mb2d1cmF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBQT1JUX01BWF9UUkFOX1VOSVQJICAgIDB4MjQgICAgLyogTVRVIHJlZ2lzdGVyIChkZWZhdWx0KSA5S0J5dGUgKi8KKyNkZWZpbmUgUE9SVF9NQVhfVE9LRU5fQlVDS0VUX1NJWkUgIDB4X2ZGRkYgIC8qIFBNVEJTIHJlZ2lzdGVyIChkZWZhdWx0KSAgICAgICovCisjZGVmaW5lIFBPUlRfVE9LRU5fUkFURQkJICAgIDEwMjMgICAgLyogUFRUQlJDIHJlZ2lzdGVyIChkZWZhdWx0KSAgICAgKi8KKworLyogTUFDIGFjY2VwZXQvcmVqZWN0IG1hY3JvcyAqLworI2RlZmluZSBBQ0NFUFRfTUFDX0FERFIJICAgIDAKKyNkZWZpbmUgUkVKRUNUX01BQ19BRERSCSAgICAxCisKKy8qIFNpemUgb2YgYSBUeC9SeCBkZXNjcmlwdG9yIHVzZWQgaW4gY2hhaW4gbGlzdCBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZSBSWF9ERVNDX0FMSUdORURfU0laRQkJMHgyMAorI2RlZmluZSBUWF9ERVNDX0FMSUdORURfU0laRQkJMHgyMAorCisvKiBBbiBvZmZlc3QgaW4gVHggZGVzY3JpcHRvcnMgdG8gc3RvcmUgZGF0YSBmb3IgYnVmZmVycyBsZXNzIHRoYW4gOCBCeXRlcyAqLworI2RlZmluZSBUWF9CVUZfT0ZGU0VUX0lOX0RFU0MJICAgIDB4MTgKKy8qIEJ1ZmZlciBvZmZzZXQgZnJvbSBidWZmZXIgcG9pbnRlciAqLworI2RlZmluZSBSWF9CVUZfT0ZGU0VUCQkJCTB4MgorCisvKiBHYXAgZGVmaW5lICovCisjZGVmaW5lIEVUSF9CQVJfR0FQCQkJCQkweDgKKyNkZWZpbmUgRVRIX1NJWkVfUkVHX0dBUAkJCQkweDgKKyNkZWZpbmUgRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfR0FQCQkJMHg0CisjZGVmaW5lIEVUSF9QT1JUX0FDQ0VTU19DVFJMX0dBUAkJCTB4NAorCisvKiBHaWdhYml0IEV0aGVybmV0IFVuaXQgR2xvYmFsIFJlZ2lzdGVycyAqLworCisvKiBNSUIgQ291bnRlcnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1cgICAweDAKKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdIICAweDQKKyNkZWZpbmUgRVRIX01JQl9CQURfT0NURVRTX1JFQ0VJVkVECSAgIDB4OAorI2RlZmluZSBFVEhfTUlCX0lOVEVSTkFMX01BQ19UUkFOU01JVF9FUlIgIDB4YworI2RlZmluZSBFVEhfTUlCX0dPT0RfRlJBTUVTX1JFQ0VJVkVECSAgIDB4MTAKKyNkZWZpbmUgRVRIX01JQl9CQURfRlJBTUVTX1JFQ0VJVkVECSAgIDB4MTQKKyNkZWZpbmUgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1JFQ0VJVkVEICAweDE4CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19SRUNFSVZFRCAgMHgxYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NF9PQ1RFVFMJICAgMHgyMAorI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NV9UT18xMjdfT0NURVRTCSAgIDB4MjQKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMTI4X1RPXzI1NV9PQ1RFVFMgICAweDI4CisjZGVmaW5lIEVUSF9NSUJfRlJBTUVTXzI1Nl9UT181MTFfT0NURVRTICAgMHgyYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU181MTJfVE9fMTAyM19PQ1RFVFMgIDB4MzAKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMTAyNF9UT19NQVhfT0NURVRTICAweDM0CisjZGVmaW5lIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9MT1cJICAgMHgzOAorI2RlZmluZSBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfSElHSAkgICAweDNjCisjZGVmaW5lIEVUSF9NSUJfR09PRF9GUkFNRVNfU0VOVAkgICAweDQwCisjZGVmaW5lIEVUSF9NSUJfRVhDRVNTSVZFX0NPTExJU0lPTgkgICAweDQ0CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19TRU5UCSAgIDB4NDgKKyNkZWZpbmUgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1NFTlQJICAgMHg0YworI2RlZmluZSBFVEhfTUlCX1VOUkVDX01BQ19DT05UUk9MX1JFQ0VJVkVEIDB4NTAKKyNkZWZpbmUgRVRIX01JQl9GQ19TRU5UCQkJICAgMHg1NAorI2RlZmluZSBFVEhfTUlCX0dPT0RfRkNfUkVDRUlWRUQJICAgMHg1OAorI2RlZmluZSBFVEhfTUlCX0JBRF9GQ19SRUNFSVZFRAkJICAgMHg1YworI2RlZmluZSBFVEhfTUlCX1VOREVSU0laRV9SRUNFSVZFRAkgICAweDYwCisjZGVmaW5lIEVUSF9NSUJfRlJBR01FTlRTX1JFQ0VJVkVECSAgIDB4NjQKKyNkZWZpbmUgRVRIX01JQl9PVkVSU0laRV9SRUNFSVZFRAkgICAweDY4CisjZGVmaW5lIEVUSF9NSUJfSkFCQkVSX1JFQ0VJVkVECQkgICAweDZjCisjZGVmaW5lIEVUSF9NSUJfTUFDX1JFQ0VJVkVfRVJST1IJICAgMHg3MAorI2RlZmluZSBFVEhfTUlCX0JBRF9DUkNfRVZFTlQJCSAgIDB4NzQKKyNkZWZpbmUgRVRIX01JQl9DT0xMSVNJT04JCSAgIDB4NzgKKyNkZWZpbmUgRVRIX01JQl9MQVRFX0NPTExJU0lPTgkJICAgMHg3YworCisvKiBQb3J0IHNlcmlhbCBzdGF0dXMgcmVnIChQU1IpICovCisjZGVmaW5lIEVUSF9JTlRFUkZBQ0VfR01JSV9NSUkJCQkJMAorI2RlZmluZSBFVEhfSU5URVJGQUNFX1BDTQkJCQlCSVQwCisjZGVmaW5lIEVUSF9MSU5LX0lTX0RPV04JCQkJMAorI2RlZmluZSBFVEhfTElOS19JU19VUAkJCQkJQklUMQorI2RlZmluZSBFVEhfUE9SVF9BVF9IQUxGX0RVUExFWAkJCQkwCisjZGVmaW5lIEVUSF9QT1JUX0FUX0ZVTExfRFVQTEVYCQkJCUJJVDIKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9ESVNBQkxFRAkJCTAKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9FTkJBTEVECQkJQklUMworI2RlZmluZSBFVEhfR01JSV9TUEVFRF8xMDBfMTAJCQkJMAorI2RlZmluZSBFVEhfR01JSV9TUEVFRF8xMDAwCQkJCUJJVDQKKyNkZWZpbmUgRVRIX01JSV9TUEVFRF8xMAkJCQkwCisjZGVmaW5lIEVUSF9NSUlfU1BFRURfMTAwCQkJCUJJVDUKKyNkZWZpbmUgRVRIX05PX1RYCQkJCQkwCisjZGVmaW5lIEVUSF9UWF9JTl9QUk9HUkVTUwkJCQlCSVQ3CisjZGVmaW5lIEVUSF9CWVBBU1NfTk9fQUNUSVZFCQkJCTAKKyNkZWZpbmUgRVRIX0JZUEFTU19BQ1RJVkUJCQkJQklUOAorI2RlZmluZSBFVEhfUE9SVF9OT1RfQVRfUEFSVElUSU9OX1NUQVRFCQkJMAorI2RlZmluZSBFVEhfUE9SVF9BVF9QQVJUSVRJT05fU1RBVEUJCQlCSVQ5CisjZGVmaW5lIEVUSF9QT1JUX1RYX0ZJRk9fTk9UX0VNUFRZCQkJMAorI2RlZmluZSBFVEhfUE9SVF9UWF9GSUZPX0VNUFRZCQkJCUJJVDEwCisKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBjb25maWd1cmF0aW9uIHJlZyAoUHhfY1IpIGJpdHMgKi8KKyNkZWZpbmUgRVRIX1VOSUNBU1RfTk9STUFMX01PREUJCQkJMAorI2RlZmluZSBFVEhfVU5JQ0FTVF9QUk9NSVNDVU9VU19NT0RFCQkJQklUMAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV8wCQkJCTAKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfMQkJCQlCSVQxCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1FVRVVFXzIJCQkJQklUMgorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV8zCQkJCShCSVQyIHwgQklUMSkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfNAkJCQlCSVQzCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1FVRVVFXzUJCQkJKEJJVDMgfCBCSVQxKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV82CQkJCShCSVQzIHwgQklUMikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfNwkJCQkoQklUMyB8IEJJVDIgfCBCSVQxKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfMAkJCTAKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzEJCQlCSVQ0CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV8yCQkJQklUNQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfMwkJCShCSVQ1IHwgQklUNCkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzQJCQlCSVQ2CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV81CQkJKEJJVDYgfCBCSVQ0KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfNgkJCShCSVQ2IHwgQklUNSkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzcJCQkoQklUNiB8IEJJVDUgfCBCSVQ0KQorI2RlZmluZSBFVEhfUkVDRUlWRV9CQ19JRl9OT1RfSVBfT1JfQVJQCQkJMAorI2RlZmluZSBFVEhfUkVKRUNUX0JDX0lGX05PVF9JUF9PUl9BUlAJCQlCSVQ3CisjZGVmaW5lIEVUSF9SRUNFSVZFX0JDX0lGX0lQCQkJCTAKKyNkZWZpbmUgRVRIX1JFSkVDVF9CQ19JRl9JUAkJCQlCSVQ4CisjZGVmaW5lIEVUSF9SRUNFSVZFX0JDX0lGX0FSUAkJCQkwCisjZGVmaW5lIEVUSF9SRUpFQ1RfQkNfSUZfQVJQCQkJCUJJVDkKKyNkZWZpbmUgRVRIX1RYX0FNX05PX1VQREFURV9FUlJPUl9TVU1NQVJZCQlCSVQxMgorI2RlZmluZSBFVEhfQ0FQVFVSRV9UQ1BfRlJBTUVTX0RJUwkJCTAKKyNkZWZpbmUgRVRIX0NBUFRVUkVfVENQX0ZSQU1FU19FTgkJCUJJVDE0CisjZGVmaW5lIEVUSF9DQVBUVVJFX1VEUF9GUkFNRVNfRElTCQkJMAorI2RlZmluZSBFVEhfQ0FQVFVSRV9VRFBfRlJBTUVTX0VOCQkJQklUMTUKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzAJCQkwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV8xCQkJQklUMTYKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzIJCQlCSVQxNworI2RlZmluZSBFVEhfREVGQVVMVF9SWF9UQ1BfUVVFVUVfMwkJCShCSVQxNyB8IEJJVDE2KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9UQ1BfUVVFVUVfNAkJCUJJVDE4CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV81CQkJKEJJVDE4IHwgQklUMTYpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV82CQkJKEJJVDE4IHwgQklUMTcpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV83CQkJKEJJVDE4IHwgQklUMTcgfCBCSVQxNikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzAJCQkwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV8xCQkJQklUMTkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzIJCQlCSVQyMAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMwkJCShCSVQyMCB8IEJJVDE5KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNAkJCShCSVQyMQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNQkJCShCSVQyMSB8IEJJVDE5KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNgkJCShCSVQyMSB8IEJJVDIwKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNwkJCShCSVQyMSB8IEJJVDIwIHwgQklUMTkpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMAkJCSAwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMQkJCUJJVDIyCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMgkJCUJJVDIzCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMwkJCShCSVQyMyB8IEJJVDIyKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzQJCQlCSVQyNAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzUJCQkoQklUMjQgfCBCSVQyMikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQlBEVV9RVUVVRV82CQkJKEJJVDI0IHwgQklUMjMpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNwkJCShCSVQyNCB8IEJJVDIzIHwgQklUMjIpCisKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBjb25maWd1cmF0aW9uIGV4dGVuZCByZWcgKFB4X2NYUikgYml0cyovCisjZGVmaW5lIEVUSF9DTEFTU0lGWV9FTgkJCQkJQklUMAorI2RlZmluZSBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfQVNfTk9STUFMCQkJMAorI2RlZmluZSBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfVE9fUlhfUVVFVUVfNwkJQklUMQorI2RlZmluZSBFVEhfUEFSVElUSU9OX0RJU0FCTEUJCQkJMAorI2RlZmluZSBFVEhfUEFSVElUSU9OX0VOQUJMRQkJCQlCSVQyCisKKworLyogVHgvUnggcXVldWUgY29tbWFuZCByZWcgKFJRQ1IvVFFDUikqLworI2RlZmluZSBFVEhfUVVFVUVfMF9FTkFCTEUJCQkJQklUMAorI2RlZmluZSBFVEhfUVVFVUVfMV9FTkFCTEUJCQkJQklUMQorI2RlZmluZSBFVEhfUVVFVUVfMl9FTkFCTEUJCQkJQklUMgorI2RlZmluZSBFVEhfUVVFVUVfM19FTkFCTEUJCQkJQklUMworI2RlZmluZSBFVEhfUVVFVUVfNF9FTkFCTEUJCQkJQklUNAorI2RlZmluZSBFVEhfUVVFVUVfNV9FTkFCTEUJCQkJQklUNQorI2RlZmluZSBFVEhfUVVFVUVfNl9FTkFCTEUJCQkJQklUNgorI2RlZmluZSBFVEhfUVVFVUVfN19FTkFCTEUJCQkJQklUNworI2RlZmluZSBFVEhfUVVFVUVfMF9ESVNBQkxFCQkJCUJJVDgKKyNkZWZpbmUgRVRIX1FVRVVFXzFfRElTQUJMRQkJCQlCSVQ5CisjZGVmaW5lIEVUSF9RVUVVRV8yX0RJU0FCTEUJCQkJQklUMTAKKyNkZWZpbmUgRVRIX1FVRVVFXzNfRElTQUJMRQkJCQlCSVQxMQorI2RlZmluZSBFVEhfUVVFVUVfNF9ESVNBQkxFCQkJCUJJVDEyCisjZGVmaW5lIEVUSF9RVUVVRV81X0RJU0FCTEUJCQkJQklUMTMKKyNkZWZpbmUgRVRIX1FVRVVFXzZfRElTQUJMRQkJCQlCSVQxNAorI2RlZmluZSBFVEhfUVVFVUVfN19ESVNBQkxFCQkJCUJJVDE1CisKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBTZG1hIGNvbmZpZ3VyYXRpb24gcmVnIChTRENSKSBiaXRzICovCisjZGVmaW5lIEVUSF9SSUZCCQkJCQlCSVQwCisjZGVmaW5lIEVUSF9SWF9CVVJTVF9TSVpFXzFfNjRCSVQJCQkwCisjZGVmaW5lIEVUSF9SWF9CVVJTVF9TSVpFXzJfNjRCSVQJCQlCSVQxCisjZGVmaW5lIEVUSF9SWF9CVVJTVF9TSVpFXzRfNjRCSVQJCQlCSVQyCisjZGVmaW5lIEVUSF9SWF9CVVJTVF9TSVpFXzhfNjRCSVQJCQkoQklUMiB8IEJJVDEpCisjZGVmaW5lIEVUSF9SWF9CVVJTVF9TSVpFXzE2XzY0QklUCQkJQklUMworI2RlZmluZSBFVEhfQkxNX1JYX05PX1NXQVAJCQkJQklUNAorI2RlZmluZSBFVEhfQkxNX1JYX0JZVEVfU1dBUAkJCQkwCisjZGVmaW5lIEVUSF9CTE1fVFhfTk9fU1dBUAkJCQlCSVQ1CisjZGVmaW5lIEVUSF9CTE1fVFhfQllURV9TV0FQCQkJCTAKKyNkZWZpbmUgRVRIX0RFU0NSSVBUT1JTX0JZVEVfU1dBUAkJCUJJVDYKKyNkZWZpbmUgRVRIX0RFU0NSSVBUT1JTX05PX1NXQVAJCQkJMAorI2RlZmluZSBFVEhfVFhfQlVSU1RfU0laRV8xXzY0QklUCQkJMAorI2RlZmluZSBFVEhfVFhfQlVSU1RfU0laRV8yXzY0QklUCQkJQklUMjIKKyNkZWZpbmUgRVRIX1RYX0JVUlNUX1NJWkVfNF82NEJJVAkJCUJJVDIzCisjZGVmaW5lIEVUSF9UWF9CVVJTVF9TSVpFXzhfNjRCSVQJCQkoQklUMjMgfCBCSVQyMikKKyNkZWZpbmUgRVRIX1RYX0JVUlNUX1NJWkVfMTZfNjRCSVQJCQlCSVQyNAorCisKKy8qIFRoZXNlIG1hY3JvcyBkZXNjcmliZXMgdGhlIFBvcnQgc2VyaWFsIGNvbnRyb2wgcmVnIChQU0NSKSBiaXRzICovCisjZGVmaW5lIEVUSF9TRVJJQUxfUE9SVF9ESVNBQkxFCQkJCTAKKyNkZWZpbmUgRVRIX1NFUklBTF9QT1JUX0VOQUJMRQkJCQlCSVQwCisjZGVmaW5lIEVUSF9GT1JDRV9MSU5LX1BBU1MJCQkJQklUMQorI2RlZmluZSBFVEhfRE9fTk9UX0ZPUkNFX0xJTktfUEFTUwkJCTAKKyNkZWZpbmUgRVRIX0VOQUJMRV9BVVRPX05FR19GT1JfRFVQTFgJCQkwCisjZGVmaW5lIEVUSF9ESVNBQkxFX0FVVE9fTkVHX0ZPUl9EVVBMWAkJCUJJVDIKKyNkZWZpbmUgRVRIX0VOQUJMRV9BVVRPX05FR19GT1JfRkxPV19DVFJMCQkwCisjZGVmaW5lIEVUSF9ESVNBQkxFX0FVVE9fTkVHX0ZPUl9GTE9XX0NUUkwJCUJJVDMKKyNkZWZpbmUgRVRIX0FEVl9OT19GTE9XX0NUUkwJCQkJMAorI2RlZmluZSBFVEhfQURWX1NZTU1FVFJJQ19GTE9XX0NUUkwJCQlCSVQ0CisjZGVmaW5lIEVUSF9GT1JDRV9GQ19NT0RFX05PX1BBVVNFX0RJU19UWAkJMAorI2RlZmluZSBFVEhfRk9SQ0VfRkNfTU9ERV9UWF9QQVVTRV9ESVMJCQlCSVQ1CisjZGVmaW5lIEVUSF9GT1JDRV9CUF9NT0RFX05PX0pBTQkJCTAKKyNkZWZpbmUgRVRIX0ZPUkNFX0JQX01PREVfSkFNX1RYCQkJQklUNworI2RlZmluZSBFVEhfRk9SQ0VfQlBfTU9ERV9KQU1fVFhfT05fUlhfRVJSCQlCSVQ4CisjZGVmaW5lIEVUSF9GT1JDRV9MSU5LX0ZBSUwJCQkJMAorI2RlZmluZSBFVEhfRE9fTk9UX0ZPUkNFX0xJTktfRkFJTAkJCUJJVDEwCisjZGVmaW5lIEVUSF9SRVRSQU5TTUlUXzE2X0VUVEVNUFRTCQkJMAorI2RlZmluZSBFVEhfUkVUUkFOU01JVF9GT1JFVkVSCQkJCUJJVDExCisjZGVmaW5lIEVUSF9ESVNBQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkJCQlCSVQxMworI2RlZmluZSBFVEhfRU5BQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkJCQkwCisjZGVmaW5lIEVUSF9EVEVfQURWXzAJCQkJCTAKKyNkZWZpbmUgRVRIX0RURV9BRFZfMQkJCQkJQklUMTQKKyNkZWZpbmUgRVRIX0RJU0FCTEVfQVVUT19ORUdfQllQQVNTCQkJMAorI2RlZmluZSBFVEhfRU5BQkxFX0FVVE9fTkVHX0JZUEFTUwkJCUJJVDE1CisjZGVmaW5lIEVUSF9BVVRPX05FR19OT19DSEFOR0UJCQkJMAorI2RlZmluZSBFVEhfUkVTVEFSVF9BVVRPX05FRwkJCQlCSVQxNgorI2RlZmluZSBFVEhfTUFYX1JYX1BBQ0tFVF8xNTE4QllURQkJCTAKKyNkZWZpbmUgRVRIX01BWF9SWF9QQUNLRVRfMTUyMkJZVEUJCQlCSVQxNworI2RlZmluZSBFVEhfTUFYX1JYX1BBQ0tFVF8xNTUyQllURQkJCUJJVDE4CisjZGVmaW5lIEVUSF9NQVhfUlhfUEFDS0VUXzkwMjJCWVRFCQkJKEJJVDE4IHwgQklUMTcpCisjZGVmaW5lIEVUSF9NQVhfUlhfUEFDS0VUXzkxOTJCWVRFCQkJQklUMTkKKyNkZWZpbmUgRVRIX01BWF9SWF9QQUNLRVRfOTcwMEJZVEUJCQkoQklUMTkgfCBCSVQxNykKKyNkZWZpbmUgRVRIX1NFVF9FWFRfTE9PUEJBQ0sJCQkJQklUMjAKKyNkZWZpbmUgRVRIX0NMUl9FWFRfTE9PUEJBQ0sJCQkJMAorI2RlZmluZSBFVEhfU0VUX0ZVTExfRFVQTEVYX01PREUJCQlCSVQyMQorI2RlZmluZSBFVEhfU0VUX0hBTEZfRFVQTEVYX01PREUJCQkwCisjZGVmaW5lIEVUSF9FTkFCTEVfRkxPV19DVFJMX1RYX1JYX0lOX0ZVTExfRFVQTEVYCUJJVDIyCisjZGVmaW5lIEVUSF9ESVNBQkxFX0ZMT1dfQ1RSTF9UWF9SWF9JTl9GVUxMX0RVUExFWAkwCisjZGVmaW5lIEVUSF9TRVRfR01JSV9TUEVFRF9UT18xMF8xMDAJCQkwCisjZGVmaW5lIEVUSF9TRVRfR01JSV9TUEVFRF9UT18xMDAwCQkJQklUMjMKKyNkZWZpbmUgRVRIX1NFVF9NSUlfU1BFRURfVE9fMTAJCQkJMAorI2RlZmluZSBFVEhfU0VUX01JSV9TUEVFRF9UT18xMDAJCQlCSVQyNAorCisKKy8qIFNNSSByZWcgKi8KKyNkZWZpbmUgRVRIX1NNSV9CVVNZCQlCSVQyOAkvKiAwIC0gV3JpdGUsIDEgLSBSZWFkCQkqLworI2RlZmluZSBFVEhfU01JX1JFQURfVkFMSUQJQklUMjcJLyogMCAtIFdyaXRlLCAxIC0gUmVhZAkJKi8KKyNkZWZpbmUgRVRIX1NNSV9PUENPREVfV1JJVEUJMAkvKiBDb21wbGV0aW9uIG9mIFJlYWQgb3BlcmF0aW9uICovCisjZGVmaW5lIEVUSF9TTUlfT1BDT0RFX1JFQUQJQklUMjYJLyogT3BlcmF0aW9uIGlzIGluIHByb2dyZXNzCQkqLworCisvKiBTRE1BIGNvbW1hbmQgc3RhdHVzIGZpZWxkcyBtYWNyb3MgKi8KKworLyogVHggJiBSeCBkZXNjcmlwdG9ycyBzdGF0dXMgKi8KKyNkZWZpbmUgRVRIX0VSUk9SX1NVTU1BUlkJCSAgICAoQklUMCkKKworLyogVHggJiBSeCBkZXNjcmlwdG9ycyBjb21tYW5kICovCisjZGVmaW5lIEVUSF9CVUZGRVJfT1dORURfQllfRE1BCQkgICAgKEJJVDMxKQorCisvKiBUeCBkZXNjcmlwdG9ycyBzdGF0dXMgKi8KKyNkZWZpbmUgRVRIX0xDX0VSUk9SCQkJICAgICgwCSAgKQorI2RlZmluZSBFVEhfVVJfRVJST1IJCQkgICAgKEJJVDEgKQorI2RlZmluZSBFVEhfUkxfRVJST1IJCQkgICAgKEJJVDIgKQorI2RlZmluZSBFVEhfTExDX1NOQVBfRk9STUFUCQkgICAgKEJJVDkgKQorCisvKiBSeCBkZXNjcmlwdG9ycyBzdGF0dXMgKi8KKyNkZWZpbmUgRVRIX0NSQ19FUlJPUgkJCSAgICAoMAkgICkKKyNkZWZpbmUgRVRIX09WRVJSVU5fRVJST1IJCSAgICAoQklUMSApCisjZGVmaW5lIEVUSF9NQVhfRlJBTUVfTEVOR1RIX0VSUk9SCSAgICAoQklUMiApCisjZGVmaW5lIEVUSF9SRVNPVVJDRV9FUlJPUgkJICAgICgoQklUMiB8IEJJVDEpKQorI2RlZmluZSBFVEhfVkxBTl9UQUdHRUQJCQkgICAgKEJJVDE5KQorI2RlZmluZSBFVEhfQlBEVV9GUkFNRQkJCSAgICAoQklUMjApCisjZGVmaW5lIEVUSF9UQ1BfRlJBTUVfT1ZFUl9JUF9WXzQJICAgICgwCSAgKQorI2RlZmluZSBFVEhfVURQX0ZSQU1FX09WRVJfSVBfVl80CSAgICAoQklUMjEpCisjZGVmaW5lIEVUSF9PVEhFUl9GUkFNRV9UWVBFCQkgICAgKEJJVDIyKQorI2RlZmluZSBFVEhfTEFZRVJfMl9JU19FVEhfVl8yCQkgICAgKEJJVDIzKQorI2RlZmluZSBFVEhfRlJBTUVfVFlQRV9JUF9WXzQJCSAgICAoQklUMjQpCisjZGVmaW5lIEVUSF9GUkFNRV9IRUFERVJfT0sJCSAgICAoQklUMjUpCisjZGVmaW5lIEVUSF9SWF9MQVNUX0RFU0MJCSAgICAoQklUMjYpCisjZGVmaW5lIEVUSF9SWF9GSVJTVF9ERVNDCQkgICAgKEJJVDI3KQorI2RlZmluZSBFVEhfVU5LTk9XTl9ERVNUSU5BVElPTl9BRERSCSAgICAoQklUMjgpCisjZGVmaW5lIEVUSF9SWF9FTkFCTEVfSU5URVJSVVBUCQkgICAgKEJJVDI5KQorI2RlZmluZSBFVEhfTEFZRVJfNF9DSEVDS1NVTV9PSwkJICAgIChCSVQzMCkKKworLyogUnggZGVzY3JpcHRvcnMgYnl0ZSBjb3VudCAqLworI2RlZmluZSBFVEhfRlJBTUVfRlJBR01FTlRFRAkJICAgIChCSVQyKQorCisvKiBUeCBkZXNjcmlwdG9ycyBjb21tYW5kICovCisjZGVmaW5lIEVUSF9MQVlFUl80X0NIRUNLU1VNX0ZJUlNUX0RFU0MJCShCSVQxMCkKKyNkZWZpbmUgRVRIX0ZSQU1FX1NFVF9UT19WTEFOCQkgICAgKEJJVDE1KQorI2RlZmluZSBFVEhfVENQX0ZSQU1FCQkJICAgICgwCSAgKQorI2RlZmluZSBFVEhfVURQX0ZSQU1FCQkJICAgIChCSVQxNikKKyNkZWZpbmUgRVRIX0dFTl9UQ1BfVURQX0NIRUNLU1VNCSAgICAoQklUMTcpCisjZGVmaW5lIEVUSF9HRU5fSVBfVl80X0NIRUNLU1VNCQkgICAgKEJJVDE4KQorI2RlZmluZSBFVEhfWkVST19QQURESU5HCQkgICAgKEJJVDE5KQorI2RlZmluZSBFVEhfVFhfTEFTVF9ERVNDCQkgICAgKEJJVDIwKQorI2RlZmluZSBFVEhfVFhfRklSU1RfREVTQwkJICAgIChCSVQyMSkKKyNkZWZpbmUgRVRIX0dFTl9DUkMJCQkgICAgKEJJVDIyKQorI2RlZmluZSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVAkJICAgIChCSVQyMykKKyNkZWZpbmUgRVRIX0FVVE9fTU9ERQkJCSAgICAoQklUMzApCisKKy8qIEFkZHJlc3MgZGVjb2RlIHBhcmFtZXRlcnMgKi8KKy8qIEV0aGVybmV0IEJhc2UgQWRkcmVzcyBSZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEVCQVJfVEFSR0VUX0RSQU0JCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9UQVJHRVRfREVWSUNFCQkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEVCQVJfVEFSR0VUX0NCUwkJCQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRUJBUl9UQVJHRVRfUENJMAkJCQkJMHgwMDAwMDAwMworI2RlZmluZSBFQkFSX1RBUkdFVF9QQ0kxCQkJCQkweDAwMDAwMDA0CisjZGVmaW5lIEVCQVJfVEFSR0VUX0NVTklUCQkJCQkweDAwMDAwMDA1CisjZGVmaW5lIEVCQVJfVEFSR0VUX0FVTklUCQkJCQkweDAwMDAwMDA2CisjZGVmaW5lIEVCQVJfVEFSR0VUX0dVTklUCQkJCQkweDAwMDAwMDA3CisKKy8qIFdpbmRvdyBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEVCQVJfQVRUUl9EUkFNX0NTMAkJCQkJMHgwMDAwMEUwMAorI2RlZmluZSBFQkFSX0FUVFJfRFJBTV9DUzEJCQkJCTB4MDAwMDBEMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fQ1MyCQkJCQkweDAwMDAwQjAwCisjZGVmaW5lIEVCQVJfQVRUUl9EUkFNX0NTMwkJCQkJMHgwMDAwMDcwMAorCisvKiBEUkFNIFRhcmdldCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fTk9fQ0FDSEVfQ09IRVJFTkNZCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fQ0FDSEVfQ09IRVJFTkNZX1dUCTB4MDAwMDEwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fQ0FDSEVfQ09IRVJFTkNZX1dCCTB4MDAwMDIwMDAKKworLyogRGV2aWNlIEJ1cyBUYXJnZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIEVCQVJfQVRUUl9ERVZJQ0VfREVWQ1MwCQkJCTB4MDAwMDFFMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RFVklDRV9ERVZDUzEJCQkJMHgwMDAwMUQwMAorI2RlZmluZSBFQkFSX0FUVFJfREVWSUNFX0RFVkNTMgkJCQkweDAwMDAxQjAwCisjZGVmaW5lIEVCQVJfQVRUUl9ERVZJQ0VfREVWQ1MzCQkJCTB4MDAwMDE3MDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RFVklDRV9CT09UQ1MzCQkJMHgwMDAwMEYwMAorCisvKiBQQ0kgVGFyZ2V0IGludGVyZmFjZSAqLworI2RlZmluZSBFQkFSX0FUVFJfUENJX0JZVEVfU1dBUAkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfTk9fU1dBUAkJCQkweDAwMDAwMTAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfQllURV9XT1JEX1NXQVAJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9XT1JEX1NXQVAJCQkJMHgwMDAwMDMwMAorI2RlZmluZSBFQkFSX0FUVFJfUENJX05PX1NOT09QX05PVF9BU1NFUlQJMHgwMDAwMDAwMAorI2RlZmluZSBFQkFSX0FUVFJfUENJX05PX1NOT09QX0FTU0VSVAkJMHgwMDAwMDQwMAorI2RlZmluZSBFQkFSX0FUVFJfUENJX0lPX1NQQUNFCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9NRU1PUllfU1BBQ0UJCQkweDAwMDAwODAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfUkVRNjRfRk9SQ0UJCQkweDAwMDAwMDAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfUkVRNjRfU0laRQkJCTB4MDAwMDEwMDAKKworLyogQ1BVIDYweCBidXMgb3IgaW50ZXJuYWwgU1JBTSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRUJBUl9BVFRSX0NCU19TUkFNX0JMT0NLMAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0NCU19TUkFNX0JMT0NLMQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0NCU19TUkFNCQkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEVCQVJfQVRUUl9DQlNfQ1BVX0JVUwkJCQkweDAwMDAwODAwCisKKy8qIFdpbmRvdyBhY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBFV0lOX0FDQ0VTU19OT1RfQUxMT1dFRCAwCisjZGVmaW5lIEVXSU5fQUNDRVNTX1JFQURfT05MWQlCSVQwCisjZGVmaW5lIEVXSU5fQUNDRVNTX0ZVTEwJKEJJVDEgfCBCSVQwKQorI2RlZmluZSBFV0lOMF9BQ0NFU1NfTUFTSwkJMHgwMDAzCisjZGVmaW5lIEVXSU4xX0FDQ0VTU19NQVNLCQkweDAwMEMKKyNkZWZpbmUgRVdJTjJfQUNDRVNTX01BU0sJCTB4MDAzMAorI2RlZmluZSBFV0lOM19BQ0NFU1NfTUFTSwkJMHgwMEMwCisKKy8qIHR5cGVkZWZzICovCisKK3R5cGVkZWYgZW51bSBfZXRoX3BvcnQKK3sKKyAgICBFVEhfMCA9IDAsCisJRVRIXzEgPSAxLAorCUVUSF8yID0gMgorfUVUSF9QT1JUOworCit0eXBlZGVmIGVudW0gX2V0aF9mdW5jX3JldF9zdGF0dXMKK3sKKyAgICBFVEhfT0ssCQkJLyogUmV0dXJuZWQgYXMgZXhwZWN0ZWQuCQkgICAgKi8KKyAgICBFVEhfRVJST1IsCQkJLyogRnVuZGFtZW50YWwgZXJyb3IuCQkJICAgICovCisgICAgRVRIX1JFVFJZLAkJCS8qIENvdWxkIG5vdCBwcm9jZXNzIHJlcXVlc3QuIFRyeSBsYXRlci4gICAgKi8KKyAgICBFVEhfRU5EX09GX0pPQiwJCS8qIFJpbmcgaGFzIG5vdGhpbmcgdG8gcHJvY2Vzcy4JCSAgICAqLworICAgIEVUSF9RVUVVRV9GVUxMLAkJLyogUmluZyByZXNvdXJjZSBlcnJvci4JCQkgICAgKi8KKyAgICBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRQkvKiBSaW5nIHJlc291cmNlcyBhYm91dCB0byBleGhhdXN0LgkgICAgKi8KK31FVEhfRlVOQ19SRVRfU1RBVFVTOworCit0eXBlZGVmIGVudW0gX2V0aF9xdWV1ZQoreworCUVUSF9RMCA9IDAsCisJRVRIX1ExID0gMSwKKwlFVEhfUTIgPSAyLAorCUVUSF9RMyA9IDMsCisJRVRIX1E0ID0gNCwKKwlFVEhfUTUgPSA1LAorCUVUSF9RNiA9IDYsCisgICAgRVRIX1E3ID0gNworfSBFVEhfUVVFVUU7CisKK3R5cGVkZWYgZW51bSBfYWRkcl93aW4KK3sKKwlFVEhfV0lOMCwKKwlFVEhfV0lOMSwKKwlFVEhfV0lOMiwKKwlFVEhfV0lOMywKKwlFVEhfV0lONCwKKyAgICBFVEhfV0lONQorfSBFVEhfQUREUl9XSU47CisKK3R5cGVkZWYgZW51bSBfZXRoX3RhcmdldAoreworCUVUSF9UQVJHRVRfRFJBTQkgLAorCUVUSF9UQVJHRVRfREVWSUNFLAorCUVUSF9UQVJHRVRfQ0JTCSAsCisJRVRIX1RBUkdFVF9QQ0kwCSAsCisJRVRIX1RBUkdFVF9QQ0kxCit9RVRIX1RBUkdFVDsKKwordHlwZWRlZiBzdHJ1Y3QgX2V0aF9yeF9kZXNjCit7CisJdW5zaWduZWQgc2hvcnQJYnl0ZV9jbnQJICAgOwkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50CSAgICAqLworCXVuc2lnbmVkIHNob3J0CWJ1Zl9zaXplCSAgIDsJLyogQnVmZmVyIHNpemUJCQkgICAgKi8KKwl1bnNpZ25lZCBpbnQJY21kX3N0cwkgICA7CS8qIERlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMJICAgICovCisJdW5zaWduZWQgaW50CW5leHRfZGVzY19wdHI7CSAgLyogTmV4dCBkZXNjcmlwdG9yIHBvaW50ZXIJICAgICAgKi8KKwl1bnNpZ25lZCBpbnQJYnVmX3B0cgkgICA7CS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIHJldHVybl9pbmZvIDsgICAgLyogVXNlciByZXNvdXJjZSByZXR1cm4gaW5mb3JtYXRpb24gKi8KK30gRVRIX1JYX0RFU0M7CisKKwordHlwZWRlZiBzdHJ1Y3QgX2V0aF90eF9kZXNjCit7CisgICAgdW5zaWduZWQgc2hvcnQgIGJ5dGVfY250CSAgIDsJLyogRGVzY3JpcHRvciBidWZmZXIgYnl0ZSBjb3VudAkgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgbDRpX2NoawkgICA7CS8qIENQVSBwcm92aWRlZCBUQ1AgQ2hlY2tzdW0JICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIGNtZF9zdHMJICAgOwkvKiBEZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzCSAgICAqLworICAgIHVuc2lnbmVkIGludCAgICBuZXh0X2Rlc2NfcHRyOyAgICAvKiBOZXh0IGRlc2NyaXB0b3IgcG9pbnRlcgkgICovCisgICAgdW5zaWduZWQgaW50ICAgIGJ1Zl9wdHIJICAgOwkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBwb2ludGVyCSAgICAqLworICAgIHVuc2lnbmVkIGludCAgICByZXR1cm5faW5mbyA7ICAgIC8qIFVzZXIgcmVzb3VyY2UgcmV0dXJuIGluZm9ybWF0aW9uICovCit9IEVUSF9UWF9ERVNDOworCisvKiBVbmlmaWVkIHN0cnVjdCBmb3IgUnggYW5kIFR4IG9wZXJhdGlvbnMuIFRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byAqLworLyogYmUgZmFtaWxpZXIgd2l0aCBuZWl0aGVyIFR4IG5vciBSeCBkZXNjcmlwdG9ycy4JCQkgKi8KK3R5cGVkZWYgc3RydWN0IF9wa3RfaW5mbworeworCXVuc2lnbmVkIHNob3J0CWJ5dGVfY250ICAgOwkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50CSAgICAqLworCXVuc2lnbmVkIHNob3J0CWw0aV9jaGsJICAgOwkvKiBUeCBDUFUgcHJvdmlkZWQgVENQIENoZWNrc3VtCSAgICAqLworCXVuc2lnbmVkIGludAljbWRfc3RzCSAgIDsJLyogRGVzY3JpcHRvciBjb21tYW5kIHN0YXR1cwkgICAgKi8KKwl1bnNpZ25lZCBpbnQJYnVmX3B0cgkgICA7CS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIHJldHVybl9pbmZvIDsgICAgLyogVXNlciByZXNvdXJjZSByZXR1cm4gaW5mb3JtYXRpb24gKi8KK30gUEtUX0lORk87CisKKwordHlwZWRlZiBzdHJ1Y3QgX2V0aF93aW5fcGFyYW0KK3sKKyAgICBFVEhfQUREUl9XSU4gd2luOwkvKiBXaW5kb3cgbnVtYmVyLiBTZWUgRVRIX0FERFJfV0lOIGVudW0gKi8KKyAgICBFVEhfVEFSR0VUCXRhcmdldDsJICAgLyogU3lzdGVtIHRhcmdldHMuIFNlZSBFVEhfVEFSR0VUIGVudW0gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBhdHRyaWJ1dGVzOwkvKiBCQVIgYXR0cmlidXRlcy4gU2VlIGFib3ZlIG1hY3Jvcy4gKi8KKyAgICB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyOyAvKiBXaW5kb3cgYmFzZSBhZGRyZXNzIGluIHVuc2lnbmVkIGludCBmb3JtICovCisgICAgdW5zaWduZWQgaW50IGhpZ2hfYWRkcjsgLyogV2luZG93IGhpZ2ggYWRkcmVzcyBpbiB1bnNpZ25lZCBpbnQgZm9ybSAqLworICAgIHVuc2lnbmVkIGludCBzaXplOyAvKiBTaXplIGluIE1CeXRlcy4gTXVzdCBiZSAlIDY0S2J5dGUuICovCisgICAgYm9vbCBlbmFibGU7IC8qIEVuYWJsZS9kaXNhYmxlIGFjY2VzcyB0byB0aGUgd2luZG93LiAqLworICAgIHVuc2lnbmVkIHNob3J0IGFjY2Vzc19jdHJsOyAvKiBBY2Nlc3MgY3RybCByZWdpc3Rlci4gc2VlIGFib3ZlIG1hY3JvcyAqLworfSBFVEhfV0lOX1BBUkFNOworCisKKy8qIEV0aGVybmV0IHBvcnQgc3BlY2lmaWMgaW5mb21hdGlvbiAqLworCit0eXBlZGVmIHN0cnVjdCBfZXRoX3BvcnRfY3RybAoreworICAgIEVUSF9QT1JUICBwb3J0X251bTsgLyogVXNlciBFdGhlcm5ldCBwb3J0IG51bWJlciAqLworICAgIGludCBwb3J0X3BoeV9hZGRyOwkvKiBVc2VyIHBoeSBhZGRyZXNzIG9mIEV0aHJuZXQgcG9ydCAqLworICAgIHVuc2lnbmVkIGNoYXIgcG9ydF9tYWNfYWRkcls2XTsgLyogVXNlciBkZWZpbmVkIHBvcnQgTUFDIGFkZHJlc3MuICovCisgICAgdW5zaWduZWQgaW50ICBwb3J0X2NvbmZpZzsgLyogVXNlciBwb3J0IGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHBvcnRfY29uZmlnX2V4dGVuZDsgLyogVXNlciBwb3J0IGNvbmZpZyBleHRlbmQgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHBvcnRfc2RtYV9jb25maWc7IC8qIFVzZXIgcG9ydCBTRE1BIGNvbmZpZyB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGludCAgcG9ydF9zZXJpYWxfY29udHJvbDsgLyogVXNlciBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlICovCisgICAgdW5zaWduZWQgaW50ICBwb3J0X3R4X3F1ZXVlX2NvbW1hbmQ7IC8qIFBvcnQgYWN0aXZlIFR4IHF1ZXVlcyBzdW1tYXJ5ICovCisgICAgdW5zaWduZWQgaW50ICBwb3J0X3J4X3F1ZXVlX2NvbW1hbmQ7IC8qIFBvcnQgYWN0aXZlIFJ4IHF1ZXVlcyBzdW1tYXJ5ICovCisKKyAgICAvKiBVc2VyIGZ1bmN0aW9uIHRvIGNhc3QgdmlydHVhbCBhZGRyZXNzIHRvIENQVSBidXMgYWRkcmVzcyAqLworICAgIHVuc2lnbmVkIGludCAgKCpwb3J0X3ZpcnRfdG9fcGh5cykodW5zaWduZWQgaW50IGFkZHIpOworICAgIC8qIFVzZXIgc2NyYXRjaCBwYWQgZm9yIHVzZXIgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzICovCisgICAgdm9pZCAqcG9ydF9wcml2YXRlOworCisgICAgYm9vbCByeF9yZXNvdXJjZV9lcnJbTUFYX1JYX1FVRVVFX05VTV07IC8qIFJ4IHJpbmcgcmVzb3VyY2UgZXJyb3IgZmxhZyAqLworICAgIGJvb2wgdHhfcmVzb3VyY2VfZXJyW01BWF9UWF9RVUVVRV9OVU1dOyAvKiBUeCByaW5nIHJlc291cmNlIGVycm9yIGZsYWcgKi8KKworICAgIC8qIFR4L1J4IHJpbmdzIG1hbmFnbWVudCBpbmRleGVzIGZpZWxkcy4gRm9yIGRyaXZlciB1c2UgKi8KKworICAgIC8qIE5leHQgYXZhaWxhYmxlIFJ4IHJlc291cmNlICovCisgICAgdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfY3Vycl9kZXNjX3FbTUFYX1JYX1FVRVVFX05VTV07CisgICAgLyogUmV0dXJuaW5nIFJ4IHJlc291cmNlICovCisgICAgdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfdXNlZF9kZXNjX3FbTUFYX1JYX1FVRVVFX05VTV07CisKKyAgICAvKiBOZXh0IGF2YWlsYWJsZSBUeCByZXNvdXJjZSAqLworICAgIHZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2N1cnJfZGVzY19xW01BWF9UWF9RVUVVRV9OVU1dOworICAgIC8qIFJldHVybmluZyBUeCByZXNvdXJjZSAqLworICAgIHZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X3VzZWRfZGVzY19xW01BWF9UWF9RVUVVRV9OVU1dOworICAgIC8qIEFuIGV4dHJhIFR4IGluZGV4IHRvIHN1cHBvcnQgdHJhbnNtaXQgb2YgbXVsdGlwbGUgYnVmZmVycyBwZXIgcGFja2V0ICovCisgICAgdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfZmlyc3RfZGVzY19xW01BWF9UWF9RVUVVRV9OVU1dOworCisgICAgLyogVHgvUnggcmluZ3Mgc2l6ZSBhbmQgYmFzZSB2YXJpYWJsZXMgZmllbGRzLiBGb3IgZHJpdmVyIHVzZSAqLworCisgICAgdm9sYXRpbGUgRVRIX1JYX0RFU0MJKnBfcnhfZGVzY19hcmVhX2Jhc2VbTUFYX1JYX1FVRVVFX05VTV07CisgICAgdW5zaWduZWQgaW50CQkgcnhfZGVzY19hcmVhX3NpemVbTUFYX1JYX1FVRVVFX05VTV07CisgICAgY2hhcgkJCSpwX3J4X2J1ZmZlcl9iYXNlW01BWF9SWF9RVUVVRV9OVU1dOworCisgICAgdm9sYXRpbGUgRVRIX1RYX0RFU0MJKnBfdHhfZGVzY19hcmVhX2Jhc2VbTUFYX1RYX1FVRVVFX05VTV07CisgICAgdW5zaWduZWQgaW50CQkgdHhfZGVzY19hcmVhX3NpemVbTUFYX1RYX1FVRVVFX05VTV07CisgICAgY2hhcgkJCSpwX3R4X2J1ZmZlcl9iYXNlW01BWF9UWF9RVUVVRV9OVU1dOworCit9IEVUSF9QT1JUX0lORk87CisKKworLyogZXRoZXJuZXQuaCBBUEkgbGlzdCAqLworCisvKiBQb3J0IG9wZXJhdGlvbiBjb250cm9sIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0IChFVEhfUE9SVF9JTkZPICpwX2V0aF9wb3J0X2N0cmwpOworc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVzZXQoRVRIX1BPUlQJZXRoX3BvcnRfbnVtKTsKK3N0YXRpYyBib29sIGV0aF9wb3J0X3N0YXJ0KEVUSF9QT1JUX0lORk8gKnBfZXRoX3BvcnRfY3RybCk7CisKKworLyogUG9ydCBNQUMgYWRkcmVzcyByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfdWNfYWRkcl9zZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKnBfYWRkciwKKwkJCQkgIEVUSF9RVUVVRSBxdWV1ZSk7CisjaWYgMAkvKiBGSVhNRSAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfbWNfYWRkcgkoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSB1bnNpZ25lZCBjaGFyICpwX2FkZHIsCisJCQkJIEVUSF9RVUVVRSBxdWV1ZSwKKwkJCQkgaW50IG9wdGlvbik7CisjZW5kaWYKKworLyogUEhZIGFuZCBNSUIgcm91dGluZXMgKi8KK3N0YXRpYyBib29sIGV0aGVybmV0X3BoeV9yZXNldChFVEhfUE9SVCBldGhfcG9ydF9udW0pOworCitzdGF0aWMgYm9vbCBldGhfcG9ydF93cml0ZV9zbWlfcmVnKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgcGh5X3JlZywKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmFsdWUpOworCitzdGF0aWMgYm9vbCBldGhfcG9ydF9yZWFkX3NtaV9yZWcoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgdW5zaWduZWQgaW50IHBoeV9yZWcsCisJCQkJICB1bnNpZ25lZCBpbnQqIHZhbHVlKTsKKworc3RhdGljIHZvaWQgZXRoX2NsZWFyX21pYl9jb3VudGVycyhFVEhfUE9SVAlldGhfcG9ydF9udW0pOworCisvKiBQb3J0IGRhdGEgZmxvdyBjb250cm9sIHJvdXRpbmVzICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9zZW5kICAgIChFVEhfUE9SVF9JTkZPICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgRVRIX1FVRVVFIHR4X3F1ZXVlLAorCQkJCQkgICAgIFBLVF9JTkZPICpwX3BrdF9pbmZvKTsKK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF90eF9yZXR1cm5fZGVzYyhFVEhfUE9SVF9JTkZPICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgIEVUSF9RVUVVRSB0eF9xdWV1ZSwKKwkJCQkJICAgICAgUEtUX0lORk8gKnBfcGt0X2luZm8pOworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3BvcnRfcmVjZWl2ZSAoRVRIX1BPUlRfSU5GTyAqcF9ldGhfcG9ydF9jdHJsLAorCQkJCQkgICAgIEVUSF9RVUVVRSByeF9xdWV1ZSwKKwkJCQkJICAgICBQS1RfSU5GTyAqcF9wa3RfaW5mbyk7CitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcnhfcmV0dXJuX2J1ZmYoRVRIX1BPUlRfSU5GTyAqcF9ldGhfcG9ydF9jdHJsLAorCQkJCQkgICAgICBFVEhfUVVFVUUgcnhfcXVldWUsCisJCQkJCSAgICAgIFBLVF9JTkZPICpwX3BrdF9pbmZvKTsKKworCitzdGF0aWMgYm9vbCBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyhFVEhfUE9SVF9JTkZPICAqcF9ldGhfcG9ydF9jdHJsLAorCQkJCSAgICBFVEhfUVVFVUUJdHhfcXVldWUsCisJCQkJICAgIGludAkJCQl0eF9kZXNjX251bSwKKwkJCQkgICAgaW50CQkJCXR4X2J1ZmZfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgaW50CXR4X2Rlc2NfYmFzZV9hZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQJdHhfYnVmZl9iYXNlX2FkZHIpOworCitzdGF0aWMgYm9vbCBldGhlcl9pbml0X3J4X2Rlc2NfcmluZyhFVEhfUE9SVF9JTkZPICAqcF9ldGhfcG9ydF9jdHJsLAorCQkJCSAgICBFVEhfUVVFVUUJcnhfcXVldWUsCisJCQkJICAgIGludAkJCQlyeF9kZXNjX251bSwKKwkJCQkgICAgaW50CQkJCXJ4X2J1ZmZfc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgaW50CXJ4X2Rlc2NfYmFzZV9hZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQJcnhfYnVmZl9iYXNlX2FkZHIpOworCisjZW5kaWYgLyogTVY2NDM2MF9FVEhfICovCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvbXZfcmVncy5oIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL212X3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYzNzBiCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL212X3JlZ3MuaApAQCAtMCwwICsxLDExMjQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIEluZ28gQXNzbXVzIDxpbmdvLmFzc211c0BrZXltaWxlLmNvbT4KKyAqCisgKiBiYXNlZCBvbiAtIERyaXZlciBmb3IgTVY2NDM2MFggZXRoZXJuZXQgcG9ydHMKKyAqIENvcHlyaWdodCAoQykgMjAwMiByYWJlZWhAZ2FsaWxlby5jby5pbAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBndDY0MzYwci5oIC0gR1QtNjQzNjAgSW50ZXJuYWwgcmVnaXN0ZXJzIGRlZmluaXRpb24gZmlsZS4KKyoKKyogREVTQ1JJUFRJT046CisqCU5vbmUuCisqCisqIERFUEVOREVOQ0lFUzoKKyoJTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNtdl9yZWdzaAorI2RlZmluZSBfX0lOQ212X3JlZ3NoCisKKyNkZWZpbmUgTVY2NDM2MAorCisvKiBTdXBwb3J0ZWQgYnkgdGhlIEF0bGFudGlzICovCisjZGVmaW5lIE1WNjQzNjBfSU5DTFVERV9QQ0lfMQorI2RlZmluZSBNVjY0MzYwX0lOQ0xVREVfUENJXzBfQVJCSVRFUgorI2RlZmluZSBNVjY0MzYwX0lOQ0xVREVfUENJXzFfQVJCSVRFUgorI2RlZmluZSBNVjY0MzYwX0lOQ0xVREVfU05PT1BfU1VQUE9SVAorI2RlZmluZSBNVjY0MzYwX0lOQ0xVREVfUDJQCisjZGVmaW5lIE1WNjQzNjBfSU5DTFVERV9FVEhfUE9SVF8yCisjZGVmaW5lIE1WNjQzNjBfSU5DTFVERV9DUFVfTUFQUElORworI2RlZmluZSBNVjY0MzYwX0lOQ0xVREVfTVBTQworCisvKiBOb3Qgc3VwcG9ydGVkIGZlYXR1cmVzICovCisjdW5kZWYJSU5DTFVERV9DTlRNUl80XzcKKyN1bmRlZglJTkNMVURFX0RNQV80XzcKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQcm9jZXNzb3IgQWRkcmVzcyBTcGFjZQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBERFIgU0RSQU0gQkFSIGFuZCBzaXplIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1WNjQzNjBfQ1NfMF9CQVNFX0FERFIJCQkJCSAgICAweDAwOAorI2RlZmluZSBNVjY0MzYwX0NTXzBfU0laRQkJCQkJICAgIDB4MDEwCisjZGVmaW5lIE1WNjQzNjBfQ1NfMV9CQVNFX0FERFIJCQkJCSAgICAweDIwOAorI2RlZmluZSBNVjY0MzYwX0NTXzFfU0laRQkJCQkJICAgIDB4MjEwCisjZGVmaW5lIE1WNjQzNjBfQ1NfMl9CQVNFX0FERFIJCQkJCSAgICAweDAxOAorI2RlZmluZSBNVjY0MzYwX0NTXzJfU0laRQkJCQkJICAgIDB4MDIwCisjZGVmaW5lIE1WNjQzNjBfQ1NfM19CQVNFX0FERFIJCQkJCSAgICAweDIxOAorI2RlZmluZSBNVjY0MzYwX0NTXzNfU0laRQkJCQkJICAgIDB4MjIwCisKKy8qIERldmljZXMgQkFSIGFuZCBzaXplIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1WNjQzNjBfREVWX0NTMF9CQVNFX0FERFIJCQkJICAgIDB4MDI4CisjZGVmaW5lIE1WNjQzNjBfREVWX0NTMF9TSVpFCQkJCQkgICAgMHgwMzAKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MxX0JBU0VfQUREUgkJCQkgICAgMHgyMjgKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MxX1NJWkUJCQkJCSAgICAweDIzMAorI2RlZmluZSBNVjY0MzYwX0RFVl9DUzJfQkFTRV9BRERSCQkJCSAgICAweDI0OAorI2RlZmluZSBNVjY0MzYwX0RFVl9DUzJfU0laRQkJCQkJICAgIDB4MjUwCisjZGVmaW5lIE1WNjQzNjBfREVWX0NTM19CQVNFX0FERFIJCQkJICAgIDB4MDM4CisjZGVmaW5lIE1WNjQzNjBfREVWX0NTM19TSVpFCQkJCQkgICAgMHgwNDAKKyNkZWZpbmUgTVY2NDM2MF9CT09UQ1NfQkFTRV9BRERSCQkJCSAgICAweDIzOAorI2RlZmluZSBNVjY0MzYwX0JPT1RDU19TSVpFCQkJCQkgICAgMHgyNDAKKworLyogUENJIDAgQkFSIGFuZCBzaXplIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfSU9fQkFTRV9BRERSCQkJCSAgICAweDA0OAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0lPX1NJWkUJCQkJCSAgICAweDA1MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTBfQkFTRV9BRERSCQkJCSAgICAweDA1OAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTBfU0laRQkJCQkgICAgMHgwNjAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkxX0JBU0VfQUREUgkJCQkgICAgMHgwODAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkxX1NJWkUJCQkJICAgIDB4MDg4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfTUVNT1JZMl9CQVNFX0FERFIJCQkJICAgIDB4MjU4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfTUVNT1JZMl9TSVpFCQkJCSAgICAweDI2MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTNfQkFTRV9BRERSCQkJCSAgICAweDI4MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTNfU0laRQkJCQkgICAgMHgyODgKKworLyogUENJIDEgQkFSIGFuZCBzaXplIHJlZ2lzdGVycyAqLworI2RlZmluZSBNVjY0MzYwX1BDSV8xX0lPX0JBU0VfQUREUgkJCQkgICAgMHgwOTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9JT19TSVpFCQkJCQkgICAgMHgwOTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkwX0JBU0VfQUREUgkJCQkgICAgMHgwYTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkwX1NJWkUJCQkJICAgIDB4MGE4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfTUVNT1JZMV9CQVNFX0FERFIJCQkJICAgIDB4MGIwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfTUVNT1JZMV9TSVpFCQkJCSAgICAweDBiOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTJfQkFTRV9BRERSCQkJCSAgICAweDJhMAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTJfU0laRQkJCQkgICAgMHgyYTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkzX0JBU0VfQUREUgkJCQkgICAgMHgyYjAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkzX1NJWkUJCQkJICAgIDB4MmI4CisKKy8qIFNSQU0gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1WNjQzNjBfSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUgkJCSAgICAweDI2OAorCisvKiBpbnRlcm5hbCByZWdpc3RlcnMgc3BhY2UgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1WNjQzNjBfSU5URVJOQUxfU1BBQ0VfQkFTRV9BRERSCQkJICAgIDB4MDY4CisKKy8qIEVuYWJsZXMgdGhlIENTICwgREVWX0NTICwgUENJIDAgYW5kIFBDSSAxCisgICB3aW5kb3dzIGFib3ZlICovCisjZGVmaW5lIE1WNjQzNjBfQkFTRV9BRERSX0VOQUJMRQkJCQkgICAgMHgyNzgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgcmVtYXAgcmVnaXN0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgLyogUENJIDAgKi8KKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9JT19BRERSX1JFTUFQCQkJCSAgICAweDBmMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTBfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgwZjgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkwX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDMyMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTFfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgxMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDMyOAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTJfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgyZjgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkyX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDMzMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01FTU9SWTNfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgzMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NRU1PUlkzX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDMzOAorICAgICAgLyogUENJIDEgKi8KKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9JT19BRERSX1JFTUFQCQkJCSAgICAweDEwOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTBfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgxMTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkwX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDM0MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTFfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgxMTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDM0OAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTJfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgzMTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkyX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDM1MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01FTU9SWTNfTE9XX0FERFJfUkVNQVAJCQkgICAgMHgzMTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NRU1PUlkzX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweDM1OAorCisjZGVmaW5lIE1WNjQzNjBfQ1BVX1BDSV8wX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJICAgIDB4M2IwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX1BDSV8wX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweDNiOAorI2RlZmluZSBNVjY0MzYwX0NQVV9QQ0lfMV9IRUFERVJTX1JFVEFSR0VUX0NPTlRST0wJCSAgICAweDNjMAorI2RlZmluZSBNVjY0MzYwX0NQVV9QQ0lfMV9IRUFERVJTX1JFVEFSR0VUX0JBU0UJCQkgICAgMHgzYzgKKyNkZWZpbmUgTVY2NDM2MF9DUFVfR0VfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJICAgIDB4M2QwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX0dFX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweDNkOAorI2RlZmluZSBNVjY0MzYwX0NQVV9JRE1BX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJICAgIDB4M2UwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX0lETUFfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJICAgIDB4M2U4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgQ1BVIENvbnRyb2wgUmVnaXN0ZXJzCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX0NQVV9DT05GSUcJCQkJCSAgICAweDAwMAorI2RlZmluZSBNVjY0MzYwX0NQVV9NT0RFCQkJCQkgICAgMHgxMjAKKyNkZWZpbmUgTVY2NDM2MF9DUFVfTUFTVEVSX0NPTlRST0wJCQkJICAgIDB4MTYwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCSAgICAweDE1MAorI2RlZmluZSBNVjY0MzYwX0NQVV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgIDB4MTU4CisjZGVmaW5lIE1WNjQzNjBfQ1BVX0NST1NTX0JBUl9USU1FT1VUCQkJCSAgICAweDE2OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNNUCBSZWdpc3RlclMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9TTVBfV0hPX0FNX0kJCQkJCSAgICAweDIwMAorI2RlZmluZSBNVjY0MzYwX1NNUF9DUFUwX0RPT1JCRUxMCQkJCSAgICAweDIxNAorI2RlZmluZSBNVjY0MzYwX1NNUF9DUFUwX0RPT1JCRUxMX0NMRUFSCQkJCSAgICAweDIxQworI2RlZmluZSBNVjY0MzYwX1NNUF9DUFUxX0RPT1JCRUxMCQkJCSAgICAweDIyNAorI2RlZmluZSBNVjY0MzYwX1NNUF9DUFUxX0RPT1JCRUxMX0NMRUFSCQkJCSAgICAweDIyQworI2RlZmluZSBNVjY0MzYwX1NNUF9DUFUwX0RPT1JCRUxMX01BU0sJCQkJICAgIDB4MjM0CisjZGVmaW5lIE1WNjQzNjBfU01QX0NQVTFfRE9PUkJFTExfTUFTSwkJCQkgICAgMHgyM0MKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1IwCQkJCQkgICAgMHgyNDQKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1IxCQkJCQkgICAgMHgyNGMKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1IyCQkJCQkgICAgMHgyNTQKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1IzCQkJCQkgICAgMHgyNWMKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1I0CQkJCQkgICAgMHgyNjQKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1I1CQkJCQkgICAgMHgyNmMKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1I2CQkJCQkgICAgMHgyNzQKKyNkZWZpbmUgTVY2NDM2MF9TTVBfU0VNQVBIT1I3CQkJCQkgICAgMHgyN2MKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgQ1BVIFN5bmMgQmFycmllciBSZWdpc3RlcgkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfQ1BVXzBfU1lOQ19CQVJSSUVSX1RSSUdHRVIJCQkgICAgMHgwYzAKKyNkZWZpbmUgTVY2NDM2MF9DUFVfMF9TWU5DX0JBUlJJRVJfVklSVFVBTAkJCSAgICAweDBjOAorI2RlZmluZSBNVjY0MzYwX0NQVV8xX1NZTkNfQkFSUklFUl9UUklHR0VSCQkJICAgIDB4MGQwCisjZGVmaW5lIE1WNjQzNjBfQ1BVXzFfU1lOQ19CQVJSSUVSX1ZJUlRVQUwJCQkgICAgMHgwZDgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDUFUgQWNjZXNzIFByb3RlY3QJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9DUFVfUFJPVEVDVF9XSU5ET1dfMF9CQVNFX0FERFIJCQkgICAgMHgxODAKKyNkZWZpbmUgTVY2NDM2MF9DUFVfUFJPVEVDVF9XSU5ET1dfMF9TSVpFCQkJICAgIDB4MTg4CisjZGVmaW5lIE1WNjQzNjBfQ1BVX1BST1RFQ1RfV0lORE9XXzFfQkFTRV9BRERSCQkJICAgIDB4MTkwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX1BST1RFQ1RfV0lORE9XXzFfU0laRQkJCSAgICAweDE5OAorI2RlZmluZSBNVjY0MzYwX0NQVV9QUk9URUNUX1dJTkRPV18yX0JBU0VfQUREUgkJCSAgICAweDFhMAorI2RlZmluZSBNVjY0MzYwX0NQVV9QUk9URUNUX1dJTkRPV18yX1NJWkUJCQkgICAgMHgxYTgKKyNkZWZpbmUgTVY2NDM2MF9DUFVfUFJPVEVDVF9XSU5ET1dfM19CQVNFX0FERFIJCQkgICAgMHgxYjAKKyNkZWZpbmUgTVY2NDM2MF9DUFVfUFJPVEVDVF9XSU5ET1dfM19TSVpFCQkJICAgIDB4MWI4CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgQ1BVIEVycm9yIFJlcG9ydAkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfQ1BVX0VSUk9SX0FERFJfTE9XCQkJCSAgICAweDA3MAorI2RlZmluZSBNVjY0MzYwX0NQVV9FUlJPUl9BRERSX0hJR0gJCQkJICAgIDB4MDc4CisjZGVmaW5lIE1WNjQzNjBfQ1BVX0VSUk9SX0RBVEFfTE9XCQkJCSAgICAweDEyOAorI2RlZmluZSBNVjY0MzYwX0NQVV9FUlJPUl9EQVRBX0hJR0gJCQkJICAgIDB4MTMwCisjZGVmaW5lIE1WNjQzNjBfQ1BVX0VSUk9SX1BBUklUWQkJCQkgICAgMHgxMzgKKyNkZWZpbmUgTVY2NDM2MF9DUFVfRVJST1JfQ0FVU0UJCQkJCSAgICAweDE0MAorI2RlZmluZSBNVjY0MzYwX0NQVV9FUlJPUl9NQVNLCQkJCQkgICAgMHgxNDgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKglDUFUgSW50ZXJmYWNlIERlYnVnIFJlZ2lzdGVycwkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QVU5JVF9TTEFWRV9ERUJVR19MT1cJCQkJICAgIDB4MzYwCisjZGVmaW5lIE1WNjQzNjBfUFVOSVRfU0xBVkVfREVCVUdfSElHSAkJCQkgICAgMHgzNjgKKyNkZWZpbmUgTVY2NDM2MF9QVU5JVF9NQVNURVJfREVCVUdfTE9XCQkJCSAgICAweDM3MAorI2RlZmluZSBNVjY0MzYwX1BVTklUX01BU1RFUl9ERUJVR19ISUdICQkJCSAgICAweDM3OAorI2RlZmluZSBNVjY0MzYwX1BVTklUX01NQVNLCQkJCQkgICAgMHgzZTQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgSW50ZWdyYXRlZCBTUkFNIFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfU1JBTV9DT05GSUcJCQkJCSAgICAweDM4MAorI2RlZmluZSBNVjY0MzYwX1NSQU1fVEVTVF9NT0RFCQkJCQkgICAgMFgzRjQKKyNkZWZpbmUgTVY2NDM2MF9TUkFNX0VSUk9SX0NBVVNFCQkJCSAgICAweDM4OAorI2RlZmluZSBNVjY0MzYwX1NSQU1fRVJST1JfQUREUgkJCQkJICAgIDB4MzkwCisjZGVmaW5lIE1WNjQzNjBfU1JBTV9FUlJPUl9BRERSX0hJR0gJCQkJICAgIDBYM0Y4CisjZGVmaW5lIE1WNjQzNjBfU1JBTV9FUlJPUl9EQVRBX0xPVwkJCQkgICAgMHgzOTgKKyNkZWZpbmUgTVY2NDM2MF9TUkFNX0VSUk9SX0RBVEFfSElHSAkJCQkgICAgMHgzYTAKKyNkZWZpbmUgTVY2NDM2MF9TUkFNX0VSUk9SX0RBVEFfUEFSSVRZCQkJCSAgICAweDNhOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNEUkFNIENvbmZpZ3VyYXRpb24JCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9DT05GSUcJCQkJCSAgICAweDE0MDAKKyNkZWZpbmUgTVY2NDM2MF9EX1VOSVRfQ09OVFJPTF9MT1cJCQkJICAgIDB4MTQwNAorI2RlZmluZSBNVjY0MzYwX0RfVU5JVF9DT05UUk9MX0hJR0gJCQkJICAgIDB4MTQyNAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX1RJTUlOR19DT05UUk9MX0xPVwkJCSAgICAweDE0MDgKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9USU1JTkdfQ09OVFJPTF9ISUdICQkJICAgIDB4MTQwYworI2RlZmluZSBNVjY0MzYwX1NEUkFNX0FERFJfQ09OVFJPTAkJCQkgICAgMHgxNDEwCisjZGVmaW5lIE1WNjQzNjBfU0RSQU1fT1BFTl9QQUdFU19DT05UUk9MCQkJICAgIDB4MTQxNAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX09QRVJBVElPTgkJCQkJICAgIDB4MTQxOAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX01PREUJCQkJCSAgICAweDE0MWMKKyNkZWZpbmUgTVY2NDM2MF9FWFRFTkRFRF9EUkFNX01PREUJCQkJICAgIDB4MTQyMAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCSAgICAweDE0MzAKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgIDB4MTQzNAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX0NST1NTX0JBUl9USU1FT1VUCQkJCSAgICAweDE0MzgKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9BRERSX0NUUkxfUEFEU19DQUxJQlJBVElPTgkJICAgIDB4MTRjMAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX0RBVEFfUEFEU19DQUxJQlJBVElPTgkJCSAgICAweDE0YzQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRFJBTSBFcnJvciBSZXBvcnQJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9FUlJPUl9EQVRBX0xPVwkJCQkgICAgMHgxNDQ0CisjZGVmaW5lIE1WNjQzNjBfU0RSQU1fRVJST1JfREFUQV9ISUdICQkJCSAgICAweDE0NDAKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9FUlJPUl9BRERSCQkJCSAgICAweDE0NTAKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9SRUNFSVZFRF9FQ0MJCQkJICAgIDB4MTQ0OAorI2RlZmluZSBNVjY0MzYwX1NEUkFNX0NBTENVTEFURURfRUNDCQkJCSAgICAweDE0NGMKKyNkZWZpbmUgTVY2NDM2MF9TRFJBTV9FQ0NfQ09OVFJPTAkJCQkgICAgMHgxNDU0CisjZGVmaW5lIE1WNjQzNjBfU0RSQU1fRUNDX0VSUk9SX0NPVU5URVIJCQkJICAgIDB4MTQ1OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIENvbnRyb2xsZWQgRGVsYXkgTGluZSAoQ0RMKSBSZWdpc3RlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9ERkNETF9DT05GSUcwCQkJCQkgICAgMHgxNDgwCisjZGVmaW5lIE1WNjQzNjBfREZDRExfQ09ORklHMQkJCQkJICAgIDB4MTQ4NAorI2RlZmluZSBNVjY0MzYwX0RMTF9XUklURQkJCQkJICAgIDB4MTQ4OAorI2RlZmluZSBNVjY0MzYwX0RMTF9SRUFECQkJCQkgICAgMHgxNDhjCisjZGVmaW5lIE1WNjQzNjBfU1JBTV9BRERSCQkJCQkgICAgMHgxNDkwCisjZGVmaW5lIE1WNjQzNjBfU1JBTV9EQVRBMAkJCQkJICAgIDB4MTQ5NAorI2RlZmluZSBNVjY0MzYwX1NSQU1fREFUQTEJCQkJCSAgICAweDE0OTgKKyNkZWZpbmUgTVY2NDM2MF9TUkFNX0RBVEEyCQkJCQkgICAgMHgxNDljCisjZGVmaW5lIE1WNjQzNjBfREZDTF9QUk9CRQkJCQkJICAgIDB4MTRhMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBEZWJ1ZyBSZWdpc3RlcnMJCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfRFVOSVRfREVCVUdfTE9XCQkJCQkgICAgMHgxNDYwCisjZGVmaW5lIE1WNjQzNjBfRFVOSVRfREVCVUdfSElHSAkJCQkgICAgMHgxNDY0CisjZGVmaW5lIE1WNjQzNjBfRFVOSVRfTU1BU0sJCQkJCSAgICAwWDFiNDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgUGFyYW1ldGVycwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX0RFVklDRV9CQU5LMF9QQVJBTUVURVJTCQkJCSAgICAweDQ1YworI2RlZmluZSBNVjY0MzYwX0RFVklDRV9CQU5LMV9QQVJBTUVURVJTCQkJCSAgICAweDQ2MAorI2RlZmluZSBNVjY0MzYwX0RFVklDRV9CQU5LMl9QQVJBTUVURVJTCQkJCSAgICAweDQ2NAorI2RlZmluZSBNVjY0MzYwX0RFVklDRV9CQU5LM19QQVJBTUVURVJTCQkJCSAgICAweDQ2OAorI2RlZmluZSBNVjY0MzYwX0RFVklDRV9CT09UX0JBTktfUEFSQU1FVEVSUwkJCSAgICAweDQ2YworI2RlZmluZSBNVjY0MzYwX0RFVklDRV9JTlRFUkZBQ0VfQ09OVFJPTAkJCSAgICAweDRjMAorI2RlZmluZSBNVjY0MzYwX0RFVklDRV9JTlRFUkZBQ0VfQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkgICAgMHg0YzgKKyNkZWZpbmUgTVY2NDM2MF9ERVZJQ0VfSU5URVJGQUNFX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCSAgICAweDRjYworI2RlZmluZSBNVjY0MzYwX0RFVklDRV9JTlRFUkZBQ0VfQ1JPU1NfQkFSX1RJTUVPVVQJCSAgICAweDRjNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9ERVZJQ0VfSU5URVJSVVBUX0NBVVNFCQkJCSAgICAweDRkMAorI2RlZmluZSBNVjY0MzYwX0RFVklDRV9JTlRFUlJVUFRfTUFTSwkJCQkgICAgMHg0ZDQKKyNkZWZpbmUgTVY2NDM2MF9ERVZJQ0VfRVJST1JfQUREUgkJCQkgICAgMHg0ZDgKKyNkZWZpbmUgTVY2NDM2MF9ERVZJQ0VfRVJST1JfREFUQQkJCQkgICAgMHg0ZGMKKyNkZWZpbmUgTVY2NDM2MF9ERVZJQ0VfRVJST1JfUEFSSVRZCQkJCSAgICAweDRlMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBkZWJ1ZyByZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX0RFVklDRV9ERUJVR19MT1cJCQkJICAgIDB4NGU0CisjZGVmaW5lIE1WNjQzNjBfREVWSUNFX0RFQlVHX0hJR0gJCQkJICAgIDB4NGU4CisjZGVmaW5lIE1WNjQzNjBfUlVOSVRfTU1BU0sJCQkJCSAgICAweDRmMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBTbGF2ZSBBZGRyZXNzIERlY29kaW5nIHJlZ2lzdGVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18wX0JBTktfU0laRQkJCQkgICAgMHhjMDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18wX0JBTktfU0laRQkJCQkgICAgMHhjODgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18xX0JBTktfU0laRQkJCQkgICAgMHhkMDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18xX0JBTktfU0laRQkJCQkgICAgMHhkODgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18yX0JBTktfU0laRQkJCQkgICAgMHhjMGMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18yX0JBTktfU0laRQkJCQkgICAgMHhjOGMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18zX0JBTktfU0laRQkJCQkgICAgMHhkMGMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18zX0JBTktfU0laRQkJCQkgICAgMHhkOGMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18wX0JBTktfU0laRQkJCQkgICAgMHhjMTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ERVZDU18wX0JBTktfU0laRQkJCQkgICAgMHhjOTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18xX0JBTktfU0laRQkJCQkgICAgMHhkMTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ERVZDU18xX0JBTktfU0laRQkJCQkgICAgMHhkOTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18yX0JBTktfU0laRQkJCQkgICAgMHhkMTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ERVZDU18yX0JBTktfU0laRQkJCQkgICAgMHhkOTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18zX0JBTktfU0laRQkJCQkgICAgMHhjMTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ERVZDU18zX0JBTktfU0laRQkJCQkgICAgMHhjOTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU19CT09UX0JBTktfU0laRQkJCSAgICAweGQxNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0RFVkNTX0JPT1RfQkFOS19TSVpFCQkJICAgIDB4ZDk0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfUDJQX01FTTBfQkFSX1NJWkUJCQkJICAgIDB4ZDFjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUDJQX01FTTBfQkFSX1NJWkUJCQkJICAgIDB4ZDljCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfUDJQX01FTTFfQkFSX1NJWkUJCQkJICAgIDB4ZDIwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUDJQX01FTTFfQkFSX1NJWkUJCQkJICAgIDB4ZGEwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfUDJQX0lfT19CQVJfU0laRQkJCQkgICAgMHhkMjQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9QMlBfSV9PX0JBUl9TSVpFCQkJCSAgICAweGRhNAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0NQVV9CQVJfU0laRQkJCQkgICAgMHhkMjgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DUFVfQkFSX1NJWkUJCQkJICAgIDB4ZGE4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfSU5URVJOQUxfU1JBTV9CQVJfU0laRQkJCSAgICAweGUwMAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0lOVEVSTkFMX1NSQU1fQkFSX1NJWkUJCQkgICAgMHhlODAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9FWFBBTlNJT05fUk9NX0JBUl9TSVpFCQkJICAgIDB4ZDJjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfRVhQQU5TSU9OX1JPTV9CQVJfU0laRQkJCSAgICAweGQ5YworI2RlZmluZSBNVjY0MzYwX1BDSV8wX0JBU0VfQUREUl9SRUdfRU5BQkxFCQkJICAgIDB4YzNjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQkFTRV9BRERSX1JFR19FTkFCTEUJCQkgICAgMHhjYmMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18wX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGM0OAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0NTXzBfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4Y2M4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ1NfMV9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkNDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18xX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGRjOAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0NTXzJfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4YzRjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQ1NfMl9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhjY2MKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18zX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGQ0YworI2RlZmluZSBNVjY0MzYwX1BDSV8xX0NTXzNfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZGNjCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ1NfMF9CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEYwNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0NTXzBfQkFTRV9ISUdIX0FERFJfUkVNQVAJCQkgICAgMHhGODQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DU18xX0JBU0VfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4RjA4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQ1NfMV9CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEY4OAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0NTXzJfQkFTRV9ISUdIX0FERFJfUkVNQVAJCQkgICAgMHhGMEMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DU18yX0JBU0VfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4RjhDCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ1NfM19CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEYxMAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0NTXzNfQkFTRV9ISUdIX0FERFJfUkVNQVAJCQkgICAgMHhGOTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18wX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGM1MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0RFVkNTXzBfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4Y2QwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfREVWQ1NfMV9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkNTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ERVZDU18xX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGRkMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0RFVkNTXzJfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZDU4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfREVWQ1NfMl9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkZDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9ERVZDU18zX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGM1NAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0RFVkNTXzNfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4Y2Q0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfREVWQ1NfQk9PVENTX0JBU0VfQUREUl9SRU1BUAkJICAgIDB4ZDU0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfREVWQ1NfQk9PVENTX0JBU0VfQUREUl9SRU1BUAkJICAgIDB4ZGQ0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0xPVwkJICAgIDB4ZDVjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0xPVwkJICAgIDB4ZGRjCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0hJR0gJCSAgICAweGQ2MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX1AyUF9NRU0wX0JBU0VfQUREUl9SRU1BUF9ISUdICQkgICAgMHhkZTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9QMlBfTUVNMV9CQVNFX0FERFJfUkVNQVBfTE9XCQkgICAgMHhkNjQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9QMlBfTUVNMV9CQVNFX0FERFJfUkVNQVBfTE9XCQkgICAgMHhkZTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9QMlBfTUVNMV9CQVNFX0FERFJfUkVNQVBfSElHSAkJICAgIDB4ZDY4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUDJQX01FTTFfQkFTRV9BRERSX1JFTUFQX0hJR0gJCSAgICAweGRlOAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX1AyUF9JX09fQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZDZjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUDJQX0lfT19CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkZWMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DUFVfQkFTRV9BRERSX1JFTUFQX0xPVwkJCSAgICAweGQ3MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0NQVV9CQVNFX0FERFJfUkVNQVBfTE9XCQkJICAgIDB4ZGYwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ1BVX0JBU0VfQUREUl9SRU1BUF9ISUdICQkJICAgIDB4ZDc0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQ1BVX0JBU0VfQUREUl9SRU1BUF9ISUdICQkJICAgIDB4ZGY0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUl9SRU1BUAkJICAgIDB4ZjAwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUl9SRU1BUAkJICAgIDB4ZjgwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfRVhQQU5TSU9OX1JPTV9CQVNFX0FERFJfUkVNQVAJCSAgICAweGYzOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0VYUEFOU0lPTl9ST01fQkFTRV9BRERSX1JFTUFQCQkgICAgMHhmYjgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BRERSX0RFQ09ERV9DT05UUk9MCQkJICAgIDB4ZDNjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUREUl9ERUNPREVfQ09OVFJPTAkJCSAgICAweGRiYworI2RlZmluZSBNVjY0MzYwX1BDSV8wX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJCSAgICAweEY0MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJCSAgICAweEZjMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweEY0NAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweEZjNAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0hFQURFUlNfUkVUQVJHRVRfSElHSAkJCSAgICAweEY0OAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0hFQURFUlNfUkVUQVJHRVRfSElHSAkJCSAgICAweEZjOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBDb250cm9sIFJlZ2lzdGVyIE1hcAkgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfRExMX1NUQVRVU19BTkRfQ09NTUFORAkJCSAgICAweDFkMjAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9ETExfU1RBVFVTX0FORF9DT01NQU5ECQkJICAgIDB4MWRhMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX01QUF9QQURTX0RSSVZFX0NPTlRST0wJCQkgICAgMHgxZDFDCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfTVBQX1BBRFNfRFJJVkVfQ09OVFJPTAkJCSAgICAweDFkOUMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9DT01NQU5ECQkJCQkgICAgMHhjMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DT01NQU5ECQkJCQkgICAgMHhjODAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NT0RFCQkJCQkgICAgMHhkMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9NT0RFCQkJCQkgICAgMHhkODAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9SRVRSWQkJCQkJICAgIDB4YzA0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfUkVUUlkJCQkJCSAgICAweGM4NAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX1JFQURfQlVGRkVSX0RJU0NBUkRfVElNRVIJCQkgICAgMHhkMDQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9SRUFEX0JVRkZFUl9ESVNDQVJEX1RJTUVSCQkJICAgIDB4ZDg0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfTVNJX1RSSUdHRVJfVElNRVIJCQkJICAgIDB4YzM4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfTVNJX1RSSUdHRVJfVElNRVIJCQkJICAgIDB4Y2I4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQVJCSVRFUl9DT05UUk9MCQkJCSAgICAweDFkMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BUkJJVEVSX0NPTlRST0wJCQkJICAgIDB4MWQ4MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCSAgICAweDFkMDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DUk9TU19CQVJfQ09OVFJPTF9MT1cJCQkgICAgMHgxZDg4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ1JPU1NfQkFSX0NPTlRST0xfSElHSAkJCSAgICAweDFkMGMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgIDB4MWQ4YworI2RlZmluZSBNVjY0MzYwX1BDSV8wX0NST1NTX0JBUl9USU1FT1VUCQkJCSAgICAweDFkMDQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DUk9TU19CQVJfVElNRU9VVAkJCQkgICAgMHgxZDg0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfU1lOQ19CQVJSSUVSX1RSSUdHRVJfUkVHCQkJICAgIDB4MUQxOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX1NZTkNfQkFSUklFUl9UUklHR0VSX1JFRwkJCSAgICAweDFEOTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9TWU5DX0JBUlJJRVJfVklSVFVBTF9SRUcJCQkgICAgMHgxZDEwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfU1lOQ19CQVJSSUVSX1ZJUlRVQUxfUkVHCQkJICAgIDB4MWQ5MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX1AyUF9DT05GSUcJCQkJICAgIDB4MWQxNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX1AyUF9DT05GSUcJCQkJICAgIDB4MWQ5NAorCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8wX0xPVwkJCSAgICAweDFlMDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzBfSElHSAkJICAgIDB4MWUwNAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfMAkJCSAgICAweDFlMDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzFfTE9XCQkJICAgIDB4MWUxMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMV9ISUdICQkgICAgMHgxZTE0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV8xCQkJICAgIDB4MWUxOAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMl9MT1cJCQkgICAgMHgxZTIwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8yX0hJR0gJCSAgICAweDFlMjQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzIJCQkgICAgMHgxZTI4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8zX0xPVwkJCSAgICAweDFlMzAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzNfSElHSAkJICAgIDB4MWUzNAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfMwkJCSAgICAweDFlMzgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzRfTE9XCQkJICAgIDB4MWU0MAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfNF9ISUdICQkgICAgMHgxZTQ0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV80CQkJICAgIDB4MWU0OAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfNV9MT1cJCQkgICAgMHgxZTUwCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV81X0hJR0gJCSAgICAweDFlNTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzUJCQkgICAgMHgxZTU4CisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCQkJICAgIDB4MWU4MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMF9ISUdICQkgICAgMHgxZTg0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV8wCQkJICAgIDB4MWU4OAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMV9MT1cJCQkgICAgMHgxZTkwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8xX0hJR0gJCSAgICAweDFlOTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzEJCQkgICAgMHgxZTk4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8yX0xPVwkJCSAgICAweDFlYTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzJfSElHSAkJICAgIDB4MWVhNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfMgkJCSAgICAweDFlYTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzNfTE9XCQkJICAgIDB4MWViMAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfM19ISUdICQkgICAgMHgxZWI0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV8zCQkJICAgIDB4MWViOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfNF9MT1cJCQkgICAgMHgxZWMwCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV80X0hJR0gJCSAgICAweDFlYzQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzQJCQkgICAgMHgxZWM4CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV81X0xPVwkJCSAgICAweDFlZDAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzVfSElHSAkJICAgIDB4MWVkNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfNQkJCSAgICAweDFlZDgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBDb25maWd1cmF0aW9uIEFjY2VzcyBSZWdpc3RlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ09ORklHX0FERFIJCQkJICAgIDB4Y2Y4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcJCQkgICAgMHhjZmMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DT05GSUdfQUREUgkJCQkgICAgMHhjNzgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9DT05GSUdfREFUQV9WSVJUVUFMX1JFRwkJCSAgICAweGM3YworI2RlZmluZSBNVjY0MzYwX1BDSV8wX0lOVEVSUlVQVF9BQ0tOT1dMRURHRV9WSVJUVUFMX1JFRwkJICAgIDB4YzM0CisjZGVmaW5lIE1WNjQzNjBfUENJXzFfSU5URVJSVVBUX0FDS05PV0xFREdFX1ZJUlRVQUxfUkVHCQkgICAgMHhjYjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBFcnJvciBSZXBvcnQgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9TRVJSX01BU0sJCQkJCSAgICAweGMyOAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX1NFUlJfTUFTSwkJCQkJICAgIDB4Y2E4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfRVJST1JfQUREUl9MT1cJCQkJICAgIDB4MWQ0MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0VSUk9SX0FERFJfTE9XCQkJCSAgICAweDFkYzAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9FUlJPUl9BRERSX0hJR0gJCQkJICAgIDB4MWQ0NAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0VSUk9SX0FERFJfSElHSAkJCQkgICAgMHgxZGM0CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfRVJST1JfQVRUUklCVVRFCQkJCSAgICAweDFkNDgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9FUlJPUl9BVFRSSUJVVEUJCQkJICAgIDB4MWRjOAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0VSUk9SX0NPTU1BTkQJCQkJICAgIDB4MWQ1MAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX0VSUk9SX0NPTU1BTkQJCQkJICAgIDB4MWRkMAorI2RlZmluZSBNVjY0MzYwX1BDSV8wX0VSUk9SX0NBVVNFCQkJCSAgICAweDFkNTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMV9FUlJPUl9DQVVTRQkJCQkgICAgMHgxZGQ4CisjZGVmaW5lIE1WNjQzNjBfUENJXzBfRVJST1JfTUFTSwkJCQkgICAgMHgxZDVjCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfRVJST1JfTUFTSwkJCQkgICAgMHgxZGRjCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBQQ0kgRGVidWcgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfMF9NTUFTSwkJCQkJICAgIDBYMUQyNAorI2RlZmluZSBNVjY0MzYwX1BDSV8xX01NQVNLCQkJCQkgICAgMFgxREE0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgQ29uZmlndXJhdGlvbiwgRnVuY3Rpb24gMCwgUmVnaXN0ZXJzICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX1BDSV9ERVZJQ0VfQU5EX1ZFTkRPUl9JRAkJCSAgICAweDAwMAorI2RlZmluZSBNVjY0MzYwX1BDSV9TVEFUVVNfQU5EX0NPTU1BTkQJCQkJICAgIDB4MDA0CisjZGVmaW5lIE1WNjQzNjBfUENJX0NMQVNTX0NPREVfQU5EX1JFVklTSU9OX0lECQkJICAgIDB4MDA4CisjZGVmaW5lIE1WNjQzNjBfUENJX0JJU1RfSEVBREVSX1RZUEVfTEFURU5DWV9USU1FUl9DQUNIRV9MSU5FCSAgICAweDAwQworCisjZGVmaW5lIE1WNjQzNjBfUENJX1NDU18wX0JBU0VfQUREUl9MT1cJCQkJICAgIDB4MDEwCisjZGVmaW5lIE1WNjQzNjBfUENJX1NDU18wX0JBU0VfQUREUl9ISUdICQkJICAgIDB4MDE0CisjZGVmaW5lIE1WNjQzNjBfUENJX1NDU18xX0JBU0VfQUREUl9MT1cJCQkJICAgIDB4MDE4CisjZGVmaW5lIE1WNjQzNjBfUENJX1NDU18xX0JBU0VfQUREUl9ISUdICQkJICAgIDB4MDFDCisjZGVmaW5lIE1WNjQzNjBfUENJX0lOVEVSTkFMX1JFR19NRU1fTUFQUEVEX0JBU0VfQUREUl9MT1cJICAgIDB4MDIwCisjZGVmaW5lIE1WNjQzNjBfUENJX0lOVEVSTkFMX1JFR19NRU1fTUFQUEVEX0JBU0VfQUREUl9ISUdICSAgICAweDAyNAorI2RlZmluZSBNVjY0MzYwX1BDSV9TVUJTWVNURU1fSURfQU5EX1NVQlNZU1RFTV9WRU5ET1JfSUQJICAgIDB4MDJjCisjZGVmaW5lIE1WNjQzNjBfUENJX0VYUEFOU0lPTl9ST01fQkFTRV9BRERSX1JFRwkJCSAgICAweDAzMAorI2RlZmluZSBNVjY0MzYwX1BDSV9DQVBBQklMVFlfTElTVF9QT0lOVEVSCQkJICAgIDB4MDM0CisjZGVmaW5lIE1WNjQzNjBfUENJX0lOVEVSUlVQVF9QSU5fQU5EX0xJTkUJCQkgICAgMHgwM0MKKyAgICAgICAvKiBjYXBhYmlsaXR5IGxpc3QgKi8KKyNkZWZpbmUgTVY2NDM2MF9QQ0lfUE9XRVJfTUFOQUdFTUVOVF9DQVBBQklMSVRZCQkJICAgIDB4MDQwCisjZGVmaW5lIE1WNjQzNjBfUENJX1BPV0VSX01BTkFHRU1FTlRfU1RBVFVTX0FORF9DT05UUk9MCQkgICAgMHgwNDQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfVlBEX0FERFIJCQkJCSAgICAweDA0OAorI2RlZmluZSBNVjY0MzYwX1BDSV9WUERfREFUQQkJCQkJICAgIDB4MDRjCisjZGVmaW5lIE1WNjQzNjBfUENJX01TSV9NRVNTQUdFX0NPTlRST0wJCQkJICAgIDB4MDUwCisjZGVmaW5lIE1WNjQzNjBfUENJX01TSV9NRVNTQUdFX0FERFIJCQkJICAgIDB4MDU0CisjZGVmaW5lIE1WNjQzNjBfUENJX01TSV9NRVNTQUdFX1VQUEVSX0FERFIJCQkgICAgMHgwNTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfTVNJX01FU1NBR0VfREFUQQkJCQkgICAgMHgwNWMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfWF9DT01NQU5ECQkJCQkgICAgMHgwNjAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfWF9TVEFUVVMJCQkJCSAgICAweDA2NAorI2RlZmluZSBNVjY0MzYwX1BDSV9DT01QQUNUX1BDSV9IT1RfU1dBUAkJCSAgICAweDA2OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBDb25maWd1cmF0aW9uLCBGdW5jdGlvbiAxLCBSZWdpc3RlcnMgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfU0NTXzJfQkFTRV9BRERSX0xPVwkJCQkgICAgMHgxMTAKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfU0NTXzJfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgxMTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfU0NTXzNfQkFTRV9BRERSX0xPVwkJCQkgICAgMHgxMTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfU0NTXzNfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgxMWMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfSU5URVJOQUxfU1JBTV9CQVNFX0FERFJfTE9XCQkJICAgIDB4MTIwCisjZGVmaW5lIE1WNjQzNjBfUENJX0lOVEVSTkFMX1NSQU1fQkFTRV9BRERSX0hJR0gJCSAgICAweDEyNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDIsIFJlZ2lzdGVycyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfREVWQ1NfMF9CQVNFX0FERFJfTE9XCQkJICAgIDB4MjEwCisjZGVmaW5lIE1WNjQzNjBfUENJX0RFVkNTXzBfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgyMTQKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfREVWQ1NfMV9CQVNFX0FERFJfTE9XCQkJICAgIDB4MjE4CisjZGVmaW5lIE1WNjQzNjBfUENJX0RFVkNTXzFfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgyMWMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfREVWQ1NfMl9CQVNFX0FERFJfTE9XCQkJICAgIDB4MjIwCisjZGVmaW5lIE1WNjQzNjBfUENJX0RFVkNTXzJfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgyMjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFBDSSBDb25maWd1cmF0aW9uLCBGdW5jdGlvbiAzLCBSZWdpc3RlcnMgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfUENJX0RFVkNTXzNfQkFTRV9BRERSX0xPVwkJCSAgICAweDMxMAorI2RlZmluZSBNVjY0MzYwX1BDSV9ERVZDU18zX0JBU0VfQUREUl9ISUdICQkJICAgIDB4MzE0CisjZGVmaW5lIE1WNjQzNjBfUENJX0JPT1RfQ1NfQkFTRV9BRERSX0xPVwkJCSAgICAweDMxOAorI2RlZmluZSBNVjY0MzYwX1BDSV9CT09UX0NTX0JBU0VfQUREUl9ISUdICQkJICAgIDB4MzFjCisjZGVmaW5lIE1WNjQzNjBfUENJX0NQVV9CQVNFX0FERFJfTE9XCQkJCSAgICAweDIyMAorI2RlZmluZSBNVjY0MzYwX1BDSV9DUFVfQkFTRV9BRERSX0hJR0gJCQkJICAgIDB4MjI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQQ0kgQ29uZmlndXJhdGlvbiwgRnVuY3Rpb24gNCwgUmVnaXN0ZXJzICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX1BDSV9QMlBfTUVNMF9CQVNFX0FERFJfTE9XCQkJICAgIDB4NDEwCisjZGVmaW5lIE1WNjQzNjBfUENJX1AyUF9NRU0wX0JBU0VfQUREUl9ISUdICQkJICAgIDB4NDE0CisjZGVmaW5lIE1WNjQzNjBfUENJX1AyUF9NRU0xX0JBU0VfQUREUl9MT1cJCQkgICAgMHg0MTgKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfUDJQX01FTTFfQkFTRV9BRERSX0hJR0gJCQkgICAgMHg0MWMKKyNkZWZpbmUgTVY2NDM2MF9QQ0lfUDJQX0lfT19CQVNFX0FERFIJCQkJICAgIDB4NDIwCisjZGVmaW5lIE1WNjQzNjBfUENJX0lOVEVSTkFMX1JFR1NfSV9PX01BUFBFRF9CQVNFX0FERFIJCSAgICAweDQyNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1lc3NhZ2luZyBVbml0IFJlZ2lzdGVycyAoSTIwKQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9NRVNTQUdFX1JFRzBfUENJXzBfU0lERQkJICAgIDB4MDEwCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcxX1BDSV8wX1NJREUJCSAgICAweDAxNAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9NRVNTQUdFX1JFRzBfUENJXzBfU0lERQkJICAgIDB4MDE4CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMV9QQ0lfMF9TSURFCQkgICAgMHgwMUMKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9ET09SQkVMTF9SRUdfUENJXzBfU0lERQkJICAgIDB4MDIwCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19QQ0lfMF9TSURFCSAgICAweDAyNAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19QQ0lfMF9TSURFCSAgICAweDAyOAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9ET09SQkVMTF9SRUdfUENJXzBfU0lERQkJICAgIDB4MDJDCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfUENJXzBfU0lERQkgICAgMHgwMzAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX1BDSV8wX1NJREUJICAgIDB4MDM0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMF9TSURFCSAgICAweDA0MAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX1BDSV8wX1NJREUJICAgIDB4MDQ0CisjZGVmaW5lIE1WNjQzNjBfSTJPX1FVRVVFX0NPTlRST0xfUkVHX1BDSV8wX1NJREUJCSAgICAweDA1MAorI2RlZmluZSBNVjY0MzYwX0kyT19RVUVVRV9CQVNFX0FERFJfUkVHX1BDSV8wX1NJREUJCSAgICAweDA1NAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDA2MAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDA2NAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDA2OAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDA2QworI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkgICAgMHgwNzAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MDc0CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDBGOAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkgICAgMHgwRkMKKworI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMV9TSURFCQkgICAgMHgwOTAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9NRVNTQUdFX1JFRzFfUENJXzFfU0lERQkJICAgIDB4MDk0CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMV9TSURFCQkgICAgMHgwOTgKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcxX1BDSV8xX1NJREUJCSAgICAweDA5QworI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMV9TSURFCQkgICAgMHgwQTAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8xX1NJREUJICAgIDB4MEE0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX1BDSV8xX1NJREUJICAgIDB4MEE4CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMV9TSURFCQkgICAgMHgwQUMKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19QQ0lfMV9TSURFCSAgICAweDBCMAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfUENJXzFfU0lERQkgICAgMHgwQjQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX1BDSV8xX1NJREUJICAgIDB4MEMwCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfUENJXzFfU0lERQkgICAgMHgwQzQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fUVVFVUVfQ09OVFJPTF9SRUdfUENJXzFfU0lERQkJICAgIDB4MEQwCisjZGVmaW5lIE1WNjQzNjBfSTJPX1FVRVVFX0JBU0VfQUREUl9SRUdfUENJXzFfU0lERQkJICAgIDB4MEQ0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MEUwCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MEU0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MEU4CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MEVDCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCSAgICAweDBGMAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwRjQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MDc4CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCSAgICAweDA3QworCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcwX0NQVTBfU0lERQkJICAgIDB4MUMxMAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMV9DUFUwX1NJREUJCSAgICAweDFDMTQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcwX0NQVTBfU0lERQkJICAgIDB4MUMxOAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfQ1BVMF9TSURFCQkgICAgMHgxQzFDCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfRE9PUkJFTExfUkVHX0NQVTBfU0lERQkJICAgIDB4MUMyMAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfQ1BVMF9TSURFCSAgICAweDFDMjQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfQ1BVMF9TSURFCSAgICAweDFDMjgKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfRE9PUkJFTExfUkVHX0NQVTBfU0lERQkJICAgIDB4MUMyQworI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX0NQVTBfU0lERQkgICAgMHgxQzMwCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19DUFUwX1NJREUJICAgIDB4MUMzNAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfQ1BVMF9TSURFCSAgICAweDFDNDAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19DUFUwX1NJREUJICAgIDB4MUM0NAorI2RlZmluZSBNVjY0MzYwX0kyT19RVUVVRV9DT05UUk9MX1JFR19DUFUwX1NJREUJCQkgICAgMHgxQzUwCisjZGVmaW5lIE1WNjQzNjBfSTJPX1FVRVVFX0JBU0VfQUREUl9SRUdfQ1BVMF9TSURFCQkgICAgMHgxQzU0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQzYwCisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQzY0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQzY4CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQzZDCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19DUFUwX1NJREUJICAgIDB4MUM3MAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDNzQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQ0Y4CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19DUFUwX1NJREUJICAgIDB4MUNGQworI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9DUFUxX1NJREUJCSAgICAweDFDOTAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9NRVNTQUdFX1JFRzFfQ1BVMV9TSURFCQkgICAgMHgxQzk0CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9DUFUxX1NJREUJCSAgICAweDFDOTgKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcxX0NQVTFfU0lERQkJICAgIDB4MUM5QworI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0RPT1JCRUxMX1JFR19DUFUxX1NJREUJCSAgICAweDFDQTAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0E0CisjZGVmaW5lIE1WNjQzNjBfSTJPX0lOQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0E4CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX0RPT1JCRUxMX1JFR19DUFUxX1NJREUJCSAgICAweDFDQUMKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19DUFUxX1NJREUJICAgIDB4MUNCMAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfQ1BVMV9TSURFCSAgICAweDFDQjQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fSU5CT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0MwCisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfQ1BVMV9TSURFCSAgICAweDFDQzQKKyNkZWZpbmUgTVY2NDM2MF9JMk9fUVVFVUVfQ09OVFJPTF9SRUdfQ1BVMV9TSURFCQkJICAgIDB4MUNEMAorI2RlZmluZSBNVjY0MzYwX0kyT19RVUVVRV9CQVNFX0FERFJfUkVHX0NQVTFfU0lERQkJICAgIDB4MUNENAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUNFMAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUNFNAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUNFOAorI2RlZmluZSBNVjY0MzYwX0kyT19JTkJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUNFQworI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCSAgICAweDFDRjAKKyNkZWZpbmUgTVY2NDM2MF9JMk9fT1VUQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0Y0CisjZGVmaW5lIE1WNjQzNjBfSTJPX09VVEJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUM3OAorI2RlZmluZSBNVjY0MzYwX0kyT19PVVRCT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCSAgICAweDFDN0MKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgIEV0aGVybmV0IFVuaXQgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUEhZX0FERFJfUkVHCQkJCSAgICAweDIwMDAKKyNkZWZpbmUgTVY2NDM2MF9FVEhfU01JX1JFRwkJCQkJICAgIDB4MjAwNAorI2RlZmluZSBNVjY0MzYwX0VUSF9VTklUX0RFRkFVTFRfQUREUl9SRUcJCQkgICAgMHgyMDA4CisjZGVmaW5lIE1WNjQzNjBfRVRIX1VOSVRfREVGQVVMVElEX1JFRwkJCQkgICAgMHgyMDBjCisjZGVmaW5lIE1WNjQzNjBfRVRIX1VOSVRfSU5URVJSVVBUX0NBVVNFX1JFRwkJCSAgICAweDIwODAKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVU5JVF9JTlRFUlJVUFRfTUFTS19SRUcJCQkgICAgMHgyMDg0CisjZGVmaW5lIE1WNjQzNjBfRVRIX1VOSVRfSU5URVJOQUxfVVNFX1JFRwkJCSAgICAweDI0ZmMKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVU5JVF9FUlJPUl9BRERSX1JFRwkJCQkgICAgMHgyMDk0CisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl8wCQkJCQkgICAgMHgyMjAwCisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl8xCQkJCQkgICAgMHgyMjA4CisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl8yCQkJCQkgICAgMHgyMjEwCisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl8zCQkJCQkgICAgMHgyMjE4CisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl80CQkJCQkgICAgMHgyMjIwCisjZGVmaW5lIE1WNjQzNjBfRVRIX0JBUl81CQkJCQkgICAgMHgyMjI4CisjZGVmaW5lIE1WNjQzNjBfRVRIX1NJWkVfUkVHXzAJCQkJCSAgICAweDIyMDQKKyNkZWZpbmUgTVY2NDM2MF9FVEhfU0laRV9SRUdfMQkJCQkJICAgIDB4MjIwYworI2RlZmluZSBNVjY0MzYwX0VUSF9TSVpFX1JFR18yCQkJCQkgICAgMHgyMjE0CisjZGVmaW5lIE1WNjQzNjBfRVRIX1NJWkVfUkVHXzMJCQkJCSAgICAweDIyMWMKKyNkZWZpbmUgTVY2NDM2MF9FVEhfU0laRV9SRUdfNAkJCQkJICAgIDB4MjIyNAorI2RlZmluZSBNVjY0MzYwX0VUSF9TSVpFX1JFR181CQkJCQkgICAgMHgyMjJjCisjZGVmaW5lIE1WNjQzNjBfRVRIX0hFQURFUlNfUkVUQVJHRVRfQkFTRV9SRUcJCQkgICAgMHgyMjMwCisjZGVmaW5lIE1WNjQzNjBfRVRIX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTF9SRUcJCSAgICAweDIyMzQKKyNkZWZpbmUgTVY2NDM2MF9FVEhfSElHSF9BRERSX1JFTUFQX1JFR18wCQkJICAgIDB4MjI4MAorI2RlZmluZSBNVjY0MzYwX0VUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzEJCQkgICAgMHgyMjg0CisjZGVmaW5lIE1WNjQzNjBfRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfMgkJCSAgICAweDIyODgKKyNkZWZpbmUgTVY2NDM2MF9FVEhfSElHSF9BRERSX1JFTUFQX1JFR18zCQkJICAgIDB4MjI4YworI2RlZmluZSBNVjY0MzYwX0VUSF9CQVNFX0FERFJfRU5BQkxFX1JFRwkJCSAgICAweDIyOTAKKyNkZWZpbmUgTVY2NDM2MF9FVEhfQUNDRVNTX1BST1RFQ1RJT05fUkVHKHBvcnQpCQkJICAgKDB4MjI5NCArIChwb3J0PDwyKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfTUlCX0NPVU5URVJTX0JBU0UocG9ydCkJCQkgICAoMHgzMDAwICsgKHBvcnQ8PDcpKQorI2RlZmluZSBNVjY0MzYwX0VUSF9QT1JUX0NPTkZJR19SRUcocG9ydCkJCQkgICAoMHgyNDAwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRyhwb3J0KQkJICAgKDB4MjQwNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX01JSV9TRVJJQUxfUEFSQU1FVFJTX1JFRyhwb3J0KQkJICAgKDB4MjQwOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0dNSUlfU0VSSUFMX1BBUkFNRVRSU19SRUcocG9ydCkJCSAgICgweDI0MGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9WTEFOX0VUSEVSVFlQRV9SRUcocG9ydCkJCQkgICAoMHgyNDEwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfTUFDX0FERFJfTE9XKHBvcnQpCQkJCSAgICgweDI0MTQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9NQUNfQUREUl9ISUdIKHBvcnQpCQkJCSAgICgweDI0MTggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9TRE1BX0NPTkZJR19SRUcocG9ydCkJCQkgICAoMHgyNDFjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfRFNDUF8wKHBvcnQpCQkJCSAgICgweDI0MjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9EU0NQXzEocG9ydCkJCQkJICAgKDB4MjQyNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0RTQ1BfMihwb3J0KQkJCQkgICAoMHgyNDI4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfRFNDUF8zKHBvcnQpCQkJCSAgICgweDI0MmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9EU0NQXzQocG9ydCkJCQkJICAgKDB4MjQzMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0RTQ1BfNShwb3J0KQkJCQkgICAoMHgyNDM0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfRFNDUF82KHBvcnQpCQkJCSAgICgweDI0MzggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0KQkJICAgKDB4MjQzYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1ZMQU5fUFJJT1JJVFlfVEFHX1RPX1BSSU9SSVRZKHBvcnQpCQkgICAoMHgyNDQwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUE9SVF9TVEFUVVNfUkVHKHBvcnQpCQkJICAgKDB4MjQ0NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnQpCQkgICAoMHgyNDQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfRklYRURfUFJJT1JJVFkocG9ydCkJCSAgICgweDI0NGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9QT1JUX1RYX1RPS0VOX0JVQ0tFVF9SQVRFX0NPTkZJRyhwb3J0KQkgICAoMHgyNDUwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfTUFYSU1VTV9UUkFOU01JVF9VTklUKHBvcnQpCQkJICAgKDB4MjQ1OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1BPUlRfTUFYSU1VTV9UT0tFTl9CVUNLRVRfU0laRShwb3J0KQkgICAoMHgyNDVjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfSU5URVJSVVBUX0NBVVNFX1JFRyhwb3J0KQkJCSAgICgweDI0NjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0KQkJICAgKDB4MjQ2NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0KQkJCSAgICgweDI0NjggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnQpCQkgICAoMHgyNDZjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhwb3J0KQkJICAgKDB4MjQ3MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRF9SRUcocG9ydCkJCSAgICgweDI0NzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9SWF9NSU5JTUFMX0ZSQU1FX1NJWkVfUkVHKHBvcnQpCQkgICAoMHgyNDdjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfRElTQ0FSREVEX0ZSQU1FU19DT1VOVEVSKHBvcnQpCQkgICAoMHgyNDg0ICsgKHBvcnQ8PDEwKQorI2RlZmluZSBNVjY0MzYwX0VUSF9QT1JUX0RFQlVHXzBfUkVHKHBvcnQpCQkJICAgKDB4MjQ4YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1BPUlRfREVCVUdfMV9SRUcocG9ydCkJCQkgICAoMHgyNDkwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUE9SVF9JTlRFUk5BTF9BRERSX0VSUk9SX1JFRyhwb3J0KQkJICAgKDB4MjQ5NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0lOVEVSTkFMX1VTRV9SRUcocG9ydCkJCQkgICAoMHgyNGZjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0KQkJICAgKDB4MjY4MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX0NVUlJFTlRfU0VSVkVEX1RYX0RFU0NfUFRSKHBvcnQpCQkgICAoMHgyNjg0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wKHBvcnQpCQkgICAoMHgyNjBjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8xKHBvcnQpCQkgICAoMHgyNjFjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8yKHBvcnQpCQkgICAoMHgyNjJjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8zKHBvcnQpCQkgICAoMHgyNjNjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl80KHBvcnQpCQkgICAoMHgyNjRjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl81KHBvcnQpCQkgICAoMHgyNjVjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl82KHBvcnQpCQkgICAoMHgyNjZjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl83KHBvcnQpCQkgICAoMHgyNjdjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wKHBvcnQpCQkgICAoMHgyNmMwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8xKHBvcnQpCQkgICAoMHgyNmM0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8yKHBvcnQpCQkgICAoMHgyNmM4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8zKHBvcnQpCQkgICAoMHgyNmNjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl80KHBvcnQpCQkgICAoMHgyNmQwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl81KHBvcnQpCQkgICAoMHgyNmQ0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl82KHBvcnQpCQkgICAoMHgyNmQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl83KHBvcnQpCQkgICAoMHgyNmRjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfMF9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV8xX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjcxMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzJfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzIwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfM19UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3MzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV80X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc0MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzVfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzUwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfNl9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3NjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV83X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc3MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzBfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkgICAoMHgyNzA0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfMV9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3MTQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV8yX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjcyNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzNfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkgICAoMHgyNzM0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfNF9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3NDQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV81X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc1NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzZfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkgICAoMHgyNzY0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfN19UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3NzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV8wX0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzA4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfMV9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJICAgKDB4MjcxOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzJfQVJCSVRFUl9DT05GSUcocG9ydCkJCSAgICgweDI3MjggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV8zX0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzM4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfNF9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJICAgKDB4Mjc0OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1RYX1FVRVVFXzVfQVJCSVRFUl9DT05GSUcocG9ydCkJCSAgICgweDI3NTggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9UWF9RVUVVRV82X0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzY4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfVFhfUVVFVUVfN19BUkJJVEVSX0NPTkZJRyhwb3J0KQkJICAgKDB4Mjc3OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQzNjBfRVRIX1BPUlRfVFhfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzgwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UocG9ydCkgICAoMHgzNDAwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDM2MF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFKHBvcnQpCSAgICgweDM1MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0MzYwX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFKHBvcnQpCQkgICAoMHgzNjAwICsgKHBvcnQ8PDEwKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgQ1VOSVQgIFJlZ2lzdGVycwkJICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJIC8qIEFkZHJlc3MgRGVjb2RpbmcgUmVnaXN0ZXIgTWFwICovCisKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfUkVHMAkJCQkgICAgMHhmMjAwCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfQkFTRV9BRERSX1JFRzEJCQkJICAgIDB4ZjIwOAorI2RlZmluZSBNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9SRUcyCQkJCSAgICAweGYyMTAKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfUkVHMwkJCQkgICAgMHhmMjE4CisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfU0laRTAJCQkJCSAgICAweGYyMDQKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9TSVpFMQkJCQkJICAgIDB4ZjIwYworI2RlZmluZSBNVjY0MzYwX0NVTklUX1NJWkUyCQkJCQkgICAgMHhmMjE0CisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfU0laRTMJCQkJCSAgICAweGYyMWMKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9ISUdIX0FERFJfUkVNQVBfUkVHMAkJCSAgICAweGYyNDAKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9ISUdIX0FERFJfUkVNQVBfUkVHMQkJCSAgICAweGYyNDQKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfRU5BQkxFX1JFRwkJCSAgICAweGYyNTAKKyNkZWZpbmUgTVY2NDM2MF9NUFNDMF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCQkgICAgMHhmMjU0CisjZGVmaW5lIE1WNjQzNjBfTVBTQzFfQUNDRVNTX1BST1RFQ1RJT05fUkVHCQkJICAgIDB4ZjI1OAorI2RlZmluZSBNVjY0MzYwX0NVTklUX0lOVEVSTkFMX1NQQUNFX0JBU0VfQUREUl9SRUcJCSAgICAweGYyNUMKKworCS8qICBFcnJvciBSZXBvcnQgUmVnaXN0ZXJzICAqLworCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfSU5URVJSVVBUX0NBVVNFX1JFRwkJCSAgICAweGYzMTAKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9JTlRFUlJVUFRfTUFTS19SRUcJCQkgICAgMHhmMzE0CisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfRVJST1JfQUREUgkJCQkgICAgMHhmMzE4CisKKwkvKiAgQ3VuaXQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNVjY0MzYwX0NVTklUX0FSQklURVJfQ09OVFJPTF9SRUcJCQkgICAgMHhmMzAwCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfQ09ORklHX1JFRwkJCQkgICAgMHhiNDBjCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfQ1JST1NCQVJfVElNRU9VVF9SRUcJCQkgICAgMHhmMzA0CisKKwkvKiAgQ3VuaXQgRGVidWcgUmVnaXN0ZXJzICAgKi8KKworI2RlZmluZSBNVjY0MzYwX0NVTklUX0RFQlVHX0xPVwkJCQkJICAgIDB4ZjM0MAorI2RlZmluZSBNVjY0MzYwX0NVTklUX0RFQlVHX0hJR0gJCQkJICAgIDB4ZjM0NAorI2RlZmluZSBNVjY0MzYwX0NVTklUX01NQVNLCQkJCQkgICAgMHhmMzgwCisKKwkvKiAgQ3VuaXQgQmFzZSBBZGRyZXNzIEVuYWJsZSBXaW5kb3cgQml0cyovCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfQkFTRV9BRERSX1dJTl8wX0JJVAkJCSAweDAKKyNkZWZpbmUgTVY2NDM2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzFfQklUCQkJIDB4MQorI2RlZmluZSBNVjY0MzYwX0NVTklUX0JBU0VfQUREUl9XSU5fMl9CSVQJCQkgMHgyCisjZGVmaW5lIE1WNjQzNjBfQ1VOSVRfQkFTRV9BRERSX1dJTl8zX0JJVAkJCSAweDMKKworCS8qICBNUFNDcyBDbG9ja3MgUm91dGluZyBSZWdpc3RlcnMgICovCisKKyNkZWZpbmUgTVY2NDM2MF9NUFNDX1JPVVRJTkdfUkVHCQkJCSAgICAweGI0MDAKKyNkZWZpbmUgTVY2NDM2MF9NUFNDX1JYX0NMT0NLX1JPVVRJTkdfUkVHCQkJICAgIDB4YjQwNAorI2RlZmluZSBNVjY0MzYwX01QU0NfVFhfQ0xPQ0tfUk9VVElOR19SRUcJCQkgICAgMHhiNDA4CisKKwkvKiAgTVBTQ3MgSW50ZXJydXB0cyBSZWdpc3RlcnMJICAqLworCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DQVVTRV9SRUcocG9ydCkJCQkJICAgKDB4YjgwNCArIChwb3J0PDwzKSkKKyNkZWZpbmUgTVY2NDM2MF9NUFNDX01BU0tfUkVHKHBvcnQpCQkJCSAgICgweGI4ODQgKyAocG9ydDw8MykpCisKKyNkZWZpbmUgTVY2NDM2MF9NUFNDX01BSU5fQ09ORklHX0xPVyhwb3J0KQkJCSAgICgweDgwMDAgKyAocG9ydDw8MTIpKQorI2RlZmluZSBNVjY0MzYwX01QU0NfTUFJTl9DT05GSUdfSElHSChwb3J0KQkJCSAgICgweDgwMDQgKyAocG9ydDw8MTIpKQorI2RlZmluZSBNVjY0MzYwX01QU0NfUFJPVE9DT0xfQ09ORklHKHBvcnQpCQkJICAgKDB4ODAwOCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzEocG9ydCkJCQkJICAgKDB4ODAwYyArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzIocG9ydCkJCQkJICAgKDB4ODAxMCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzMocG9ydCkJCQkJICAgKDB4ODAxNCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzQocG9ydCkJCQkJICAgKDB4ODAxOCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzUocG9ydCkJCQkJICAgKDB4ODAxYyArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzYocG9ydCkJCQkJICAgKDB4ODAyMCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzcocG9ydCkJCQkJICAgKDB4ODAyNCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzgocG9ydCkJCQkJICAgKDB4ODAyOCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzkocG9ydCkJCQkJICAgKDB4ODAyYyArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQzNjBfTVBTQ19DSEFOTkVMX1JFRzEwKHBvcnQpCQkJICAgKDB4ODAzMCArIChwb3J0PDwxMikpCisKKwkvKiAgTVBTQzAgUmVnaXN0ZXJzCSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgU0RNQSBSZWdpc3RlcnMJICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9DT05GSUdfUkVHKGNoYW5uZWwpCQkJKDB4NDAwMCArIChjaGFubmVsPDwxMykpCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9DT01NQU5EX1JFRyhjaGFubmVsKQkJCSgweDQwMDggKyAoY2hhbm5lbDw8MTMpKQorI2RlZmluZSBNVjY0MzYwX1NETUFfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIoY2hhbm5lbCkJKDB4NDgxMCArIChjaGFubmVsPDwxMykpCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9DVVJSRU5UX1RYX0RFU0NSSVBUT1JfUE9JTlRFUihjaGFubmVsKQkoMHg0YzEwICsgKGNoYW5uZWw8PDEzKSkKKyNkZWZpbmUgTVY2NDM2MF9TRE1BX0ZJUlNUX1RYX0RFU0NSSVBUT1JfUE9JTlRFUihjaGFubmVsKQkoMHg0YzE0ICsgKGNoYW5uZWw8PDEzKSkKKworI2RlZmluZSBNVjY0MzYwX1NETUFfQ0FVU0VfUkVHCQkJCQkgICAgMHhiODAwCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9NQVNLX1JFRwkJCQkJICAgIDB4Yjg4MAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0RNQSBBZGRyZXNzIFNwYWNlIFRhcmdldHMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX1NETUFfRFJBTV9DU18wX1RBUkdFVAkJCQkgICAgMHgwZTAwCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9EUkFNX0NTXzFfVEFSR0VUCQkJCSAgICAweDBkMDAKKyNkZWZpbmUgTVY2NDM2MF9TRE1BX0RSQU1fQ1NfMl9UQVJHRVQJCQkJICAgIDB4MGIwMAorI2RlZmluZSBNVjY0MzYwX1NETUFfRFJBTV9DU18zX1RBUkdFVAkJCQkgICAgMHgwNzAwCisKKyNkZWZpbmUgTVY2NDM2MF9TRE1BX0RFVl9DU18wX1RBUkdFVAkJCQkgICAgMHgxZTAxCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9ERVZfQ1NfMV9UQVJHRVQJCQkJICAgIDB4MWQwMQorI2RlZmluZSBNVjY0MzYwX1NETUFfREVWX0NTXzJfVEFSR0VUCQkJCSAgICAweDFiMDEKKyNkZWZpbmUgTVY2NDM2MF9TRE1BX0RFVl9DU18zX1RBUkdFVAkJCQkgICAgMHgxNzAxCisKKyNkZWZpbmUgTVY2NDM2MF9TRE1BX0JPT1RfQ1NfVEFSR0VUCQkJCSAgICAweDBmMDAKKworI2RlZmluZSBNVjY0MzYwX1NETUFfU1JBTV9UQVJHRVQJCQkJICAgIDB4MDAwMworI2RlZmluZSBNVjY0MzYwX1NETUFfNjBYX0JVU19UQVJHRVQJCQkJICAgIDB4NDAwMworCisjZGVmaW5lIE1WNjQzNjBfUENJXzBfVEFSR0VUCQkJCQkgICAgMHgwMDAzCisjZGVmaW5lIE1WNjQzNjBfUENJXzFfVEFSR0VUCQkJCQkgICAgMHgwMDA0CisKKworLyogRGV2aWNlcyBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MwX0JBU0VfQUREUgkJCQkgICAgMHgwMjgKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MwX1NJWkUJCQkJCSAgICAweDAzMAorI2RlZmluZSBNVjY0MzYwX0RFVl9DUzFfQkFTRV9BRERSCQkJCSAgICAweDIyOAorI2RlZmluZSBNVjY0MzYwX0RFVl9DUzFfU0laRQkJCQkJICAgIDB4MjMwCisjZGVmaW5lIE1WNjQzNjBfREVWX0NTMl9CQVNFX0FERFIJCQkJICAgIDB4MjQ4CisjZGVmaW5lIE1WNjQzNjBfREVWX0NTMl9TSVpFCQkJCQkgICAgMHgyNTAKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MzX0JBU0VfQUREUgkJCQkgICAgMHgwMzgKKyNkZWZpbmUgTVY2NDM2MF9ERVZfQ1MzX1NJWkUJCQkJCSAgICAweDA0MAorI2RlZmluZSBNVjY0MzYwX0JPT1RDU19CQVNFX0FERFIJCQkJICAgIDB4MjM4CisjZGVmaW5lIE1WNjQzNjBfQk9PVENTX1NJWkUJCQkJCSAgICAweDI0MAorCisvKiBTRE1BIFdpbmRvdyBhY2Nlc3MgcHJvdGVjdGlvbiAqLworI2RlZmluZSBNVjY0MzYwX1NETUFfV0lOX0FDQ0VTU19OT1RfQUxMT1dFRCAwCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9XSU5fQUNDRVNTX1JFQURfT05MWSAxCisjZGVmaW5lIE1WNjQzNjBfU0RNQV9XSU5fQUNDRVNTX0ZVTEwgMgorCisvKiBCUkcgSW50ZXJydXB0cyAqLworCisjZGVmaW5lIE1WNjQzNjBfQlJHX0NPTkZJR19SRUcoYnJnKQkJCQkgKDB4YjIwMCArIChicmc8PDMpKQorI2RlZmluZSBNVjY0MzYwX0JSR19CQVVERV9UVU5JTkdfUkVHKGJyZykJCQkgKDB4YjIwNCArIChicmc8PDMpKQorI2RlZmluZSBNVjY0MzYwX0JSR19DQVVTRV9SRUcJCQkJCSAgICAweGI4MzQKKyNkZWZpbmUgTVY2NDM2MF9CUkdfTUFTS19SRUcJCQkJCSAgICAweGI4YjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBETUEgQ2hhbm5lbCBDb250cm9sCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwwX0NPTlRST0wJCQkJICAgIDB4ODQwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwwX0NPTlRST0xfSElHSAkJCSAgICAweDg4MAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMV9DT05UUk9MCQkJCSAgICAweDg0NAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMV9DT05UUk9MX0hJR0gJCQkgICAgMHg4ODQKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDJfQ09OVFJPTAkJCQkgICAgMHg4NDgKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDJfQ09OVFJPTF9ISUdICQkJICAgIDB4ODg4CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwzX0NPTlRST0wJCQkJICAgIDB4ODRDCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwzX0NPTlRST0xfSElHSAkJCSAgICAweDg4QworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgICBJRE1BIFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwwX0JZVEVfQ09VTlQJCQkJICAgIDB4ODAwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwxX0JZVEVfQ09VTlQJCQkJICAgIDB4ODA0CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwyX0JZVEVfQ09VTlQJCQkJICAgIDB4ODA4CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwzX0JZVEVfQ09VTlQJCQkJICAgIDB4ODBDCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwwX1NPVVJDRV9BRERSCQkJICAgIDB4ODEwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwxX1NPVVJDRV9BRERSCQkJICAgIDB4ODE0CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwyX1NPVVJDRV9BRERSCQkJICAgIDB4ODE4CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwzX1NPVVJDRV9BRERSCQkJICAgIDB4ODFjCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwwX0RFU1RJTkFUSU9OX0FERFIJCQkgICAgMHg4MjAKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDFfREVTVElOQVRJT05fQUREUgkJCSAgICAweDgyNAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMl9ERVNUSU5BVElPTl9BRERSCQkJICAgIDB4ODI4CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwzX0RFU1RJTkFUSU9OX0FERFIJCQkgICAgMHg4MkMKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDBfTkVYVF9ERVNDUklQVE9SX1BPSU5URVIJCSAgICAweDgzMAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMV9ORVhUX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODM0CisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwyX05FWFRfREVTQ1JJUFRPUl9QT0lOVEVSCQkgICAgMHg4MzgKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDNfTkVYVF9ERVNDUklQVE9SX1BPSU5URVIJCSAgICAweDgzQworI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMF9DVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODcwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NIQU5ORUwxX0NVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkgICAgMHg4NzQKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQ0hBTk5FTDJfQ1VSUkVOVF9ERVNDUklQVE9SX1BPSU5URVIJCSAgICAweDg3OAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMM19DVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODdDCisKKyAvKiAgSURNQSBBZGRyZXNzIERlY29kaW5nIEJhc2UgQWRkcmVzcyBSZWdpc3RlcnMgICovCisKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQkFTRV9BRERSX1JFRzAJCQkJICAgIDB4YTAwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0JBU0VfQUREUl9SRUcxCQkJCSAgICAweGEwOAorI2RlZmluZSBNVjY0MzYwX0RNQV9CQVNFX0FERFJfUkVHMgkJCQkgICAgMHhhMTAKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQkFTRV9BRERSX1JFRzMJCQkJICAgIDB4YTE4CisjZGVmaW5lIE1WNjQzNjBfRE1BX0JBU0VfQUREUl9SRUc0CQkJCSAgICAweGEyMAorI2RlZmluZSBNVjY0MzYwX0RNQV9CQVNFX0FERFJfUkVHNQkJCQkgICAgMHhhMjgKKyNkZWZpbmUgTVY2NDM2MF9ETUFfQkFTRV9BRERSX1JFRzYJCQkJICAgIDB4YTMwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0JBU0VfQUREUl9SRUc3CQkJCSAgICAweGEzOAorCisgLyogIElETUEgQWRkcmVzcyBEZWNvZGluZyBTaXplIEFkZHJlc3MgUmVnaXN0ZXIgICAqLworCisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHMAkJCQkJICAgIDB4YTA0CisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHMQkJCQkJICAgIDB4YTBjCisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHMgkJCQkJICAgIDB4YTE0CisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHMwkJCQkJICAgIDB4YTFjCisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHNAkJCQkJICAgIDB4YTI0CisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHNQkJCQkJICAgIDB4YTJjCisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHNgkJCQkJICAgIDB4YTM0CisjZGVmaW5lIE1WNjQzNjBfRE1BX1NJWkVfUkVHNwkJCQkJICAgIDB4YTNDCisKKyAvKiBJRE1BIEFkZHJlc3MgRGVjb2RpbmcgSGlnaCBBZGRyZXNzIFJlbWFwIGFuZCBBY2Nlc3MKKwkJICBQcm90ZWN0aW9uIFJlZ2lzdGVycwkJCSAgKi8KKworI2RlZmluZSBNVjY0MzYwX0RNQV9ISUdIX0FERFJfUkVNQVBfUkVHMAkJCSAgICAweGE2MAorI2RlZmluZSBNVjY0MzYwX0RNQV9ISUdIX0FERFJfUkVNQVBfUkVHMQkJCSAgICAweGE2NAorI2RlZmluZSBNVjY0MzYwX0RNQV9ISUdIX0FERFJfUkVNQVBfUkVHMgkJCSAgICAweGE2OAorI2RlZmluZSBNVjY0MzYwX0RNQV9ISUdIX0FERFJfUkVNQVBfUkVHMwkJCSAgICAweGE2QworI2RlZmluZSBNVjY0MzYwX0RNQV9CQVNFX0FERFJfRU5BQkxFX1JFRwkJCSAgICAweGE4MAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgICAweGE3MAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMV9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgICAweGE3NAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMMl9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgICAweGE3OAorI2RlZmluZSBNVjY0MzYwX0RNQV9DSEFOTkVMM19BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgICAweGE3YworI2RlZmluZSBNVjY0MzYwX0RNQV9BUkJJVEVSX0NPTlRST0wJCQkJICAgIDB4ODYwCisjZGVmaW5lIE1WNjQzNjBfRE1BX0NST1NTX0JBUl9USU1FT1VUCQkJCSAgICAweDhkMAorCisgLyogIElETUEgSGVhZGVycyBSZXRhcmdldCBSZWdpc3RlcnMgICAqLworCisjZGVmaW5lIE1WNjQzNjBfRE1BX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJCSAgICAweGE4NAorI2RlZmluZSBNVjY0MzYwX0RNQV9IRUFERVJTX1JFVEFSR0VUX0JBU0UJCQkgICAgMHhhODgKKworIC8qICBJRE1BIEludGVycnVwdCBSZWdpc3RlciAgKi8KKworI2RlZmluZSBNVjY0MzYwX0RNQV9JTlRFUlJVUFRfQ0FVU0VfUkVHCQkJCSAgICAweDhjMAorI2RlZmluZSBNVjY0MzYwX0RNQV9JTlRFUlJVUFRfQ0FVU0VfTUFTSwkJCSAgICAweDhjNAorI2RlZmluZSBNVjY0MzYwX0RNQV9FUlJPUl9BRERSCQkJCQkgICAgMHg4YzgKKyNkZWZpbmUgTVY2NDM2MF9ETUFfRVJST1JfU0VMRUNUCQkJCSAgICAweDhjYworCisgLyogIElETUEgRGVidWcgUmVnaXN0ZXIgKCBmb3IgaW50ZXJuYWwgdXNlICkJICovCisKKyNkZWZpbmUgTVY2NDM2MF9ETUFfREVCVUdfTE9XCQkJCQkgICAgMHg4ZTAKKyNkZWZpbmUgTVY2NDM2MF9ETUFfREVCVUdfSElHSAkJCQkJICAgIDB4OGU0CisjZGVmaW5lIE1WNjQzNjBfRE1BX1NQQVJFCQkJCQkgICAgMHhBOEMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaW1lcl9Db3VudGVyCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfVElNRVJfQ09VTlRFUjAJCQkJCSAgICAweDg1MAorI2RlZmluZSBNVjY0MzYwX1RJTUVSX0NPVU5URVIxCQkJCQkgICAgMHg4NTQKKyNkZWZpbmUgTVY2NDM2MF9USU1FUl9DT1VOVEVSMgkJCQkJICAgIDB4ODU4CisjZGVmaW5lIE1WNjQzNjBfVElNRVJfQ09VTlRFUjMJCQkJCSAgICAweDg1QworI2RlZmluZSBNVjY0MzYwX1RJTUVSX0NPVU5URVJfMF8zX0NPTlRST0wJCQkgICAgMHg4NjQKKyNkZWZpbmUgTVY2NDM2MF9USU1FUl9DT1VOVEVSXzBfM19JTlRFUlJVUFRfQ0FVU0UJCSAgICAweDg2OAorI2RlZmluZSBNVjY0MzYwX1RJTUVSX0NPVU5URVJfMF8zX0lOVEVSUlVQVF9NQVNLCQkgICAgMHg4NmMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICBXYXRjaGRvZyByZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX1dBVENIRE9HX0NPTkZJR19SRUcJCQkJICAgIDB4YjQxMAorI2RlZmluZSBNVjY0MzYwX1dBVENIRE9HX1ZBTFVFX1JFRwkJCQkgICAgMHhiNDE0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSTJDIFJlZ2lzdGVycwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX0kyQ19TTEFWRV9BRERSCQkJCQkgICAgMHhjMDAwCisjZGVmaW5lIE1WNjQzNjBfSTJDX0VYVEVOREVEX1NMQVZFX0FERFIJCQkJICAgIDB4YzAxMAorI2RlZmluZSBNVjY0MzYwX0kyQ19EQVRBCQkJCQkgICAgMHhjMDA0CisjZGVmaW5lIE1WNjQzNjBfSTJDX0NPTlRST0wJCQkJCSAgICAweGMwMDgKKyNkZWZpbmUgTVY2NDM2MF9JMkNfU1RBVFVTX0JBVURFX1JBVEUJCQkJICAgIDB4YzAwQworI2RlZmluZSBNVjY0MzYwX0kyQ19TT0ZUX1JFU0VUCQkJCQkgICAgMHhjMDFjCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR1BQIEludGVyZmFjZSBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX0dQUF9JT19DT05UUk9MCQkJCQkgICAgMHhmMTAwCisjZGVmaW5lIE1WNjQzNjBfR1BQX0xFVkVMX0NPTlRST0wJCQkJICAgIDB4ZjExMAorI2RlZmluZSBNVjY0MzYwX0dQUF9WQUxVRQkJCQkJICAgIDB4ZjEwNAorI2RlZmluZSBNVjY0MzYwX0dQUF9JTlRFUlJVUFRfQ0FVU0UJCQkJICAgIDB4ZjEwOAorI2RlZmluZSBNVjY0MzYwX0dQUF9JTlRFUlJVUFRfTUFTSzAJCQkJICAgIDB4ZjEwYworI2RlZmluZSBNVjY0MzYwX0dQUF9JTlRFUlJVUFRfTUFTSzEJCQkJICAgIDB4ZjExNAorI2RlZmluZSBNVjY0MzYwX0dQUF9WQUxVRV9TRVQJCQkJCSAgICAweGYxMTgKKyNkZWZpbmUgTVY2NDM2MF9HUFBfVkFMVUVfQ0xFQVIJCQkJCSAgICAweGYxMWMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdHMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQzNjBfTUFJTl9JTlRFUlJVUFRfQ0FVU0VfTE9XCQkJICAgIDB4MDA0CisjZGVmaW5lIE1WNjQzNjBfTUFJTl9JTlRFUlJVUFRfQ0FVU0VfSElHSAkJCSAgICAweDAwYworI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQwX01BU0tfTE9XCQkJCSAgICAweDAxNAorI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQwX01BU0tfSElHSAkJCSAgICAweDAxYworI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQwX1NFTEVDVF9DQVVTRQkJCSAgICAweDAyNAorI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQxX01BU0tfTE9XCQkJCSAgICAweDAzNAorI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQxX01BU0tfSElHSAkJCSAgICAweDAzYworI2RlZmluZSBNVjY0MzYwX0NQVV9JTlRFUlJVUFQxX1NFTEVDVF9DQVVTRQkJCSAgICAweDA0NAorI2RlZmluZSBNVjY0MzYwX0lOVEVSUlVQVDBfTUFTS18wX0xPVwkJCQkgICAgMHgwNTQKKyNkZWZpbmUgTVY2NDM2MF9JTlRFUlJVUFQwX01BU0tfMF9ISUdICQkJCSAgICAweDA1YworI2RlZmluZSBNVjY0MzYwX0lOVEVSUlVQVDBfU0VMRUNUX0NBVVNFCQkJCSAgICAweDA2NAorI2RlZmluZSBNVjY0MzYwX0lOVEVSUlVQVDFfTUFTS18wX0xPVwkJCQkgICAgMHgwNzQKKyNkZWZpbmUgTVY2NDM2MF9JTlRFUlJVUFQxX01BU0tfMF9ISUdICQkJCSAgICAweDA3YworI2RlZmluZSBNVjY0MzYwX0lOVEVSUlVQVDFfU0VMRUNUX0NBVVNFCQkJCSAgICAweDA4NAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCU1QUCBJbnRlcmZhY2UgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDM2MF9NUFBfQ09OVFJPTDAJCQkJCSAgICAweGYwMDAKKyNkZWZpbmUgTVY2NDM2MF9NUFBfQ09OVFJPTDEJCQkJCSAgICAweGYwMDQKKyNkZWZpbmUgTVY2NDM2MF9NUFBfQ09OVFJPTDIJCQkJCSAgICAweGYwMDgKKyNkZWZpbmUgTVY2NDM2MF9NUFBfQ09OVFJPTDMJCQkJCSAgICAweGYwMGMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICBTZXJpYWwgSW5pdGlhbGl6YXRpb24gcmVnaXN0ZXJzCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0MzYwX1NFUklBTF9JTklUX0xBU1RfREFUQQkJCQkgICAgMHhmMzI0CisjZGVmaW5lIE1WNjQzNjBfU0VSSUFMX0lOSVRfQ09OVFJPTAkJCQkgICAgMHhmMzI4CisjZGVmaW5lIE1WNjQzNjBfU0VSSUFMX0lOSVRfU1RBVFVTCQkJCSAgICAweGYzMmMKKworCisjZW5kaWYgLyogX19JTkNndDY0MzYwcmggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9wY2kuYyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjM3Mjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL3BjaS5jCkBAIC0wLDAgKzEsOTQwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworLyogUENJLmMgLSBQQ0kgZnVuY3Rpb25zICovCisKKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHBjaS5oPgorCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9wY2kuaCIKKworI3VuZGVmIERFQlVHCisjdW5kZWYgSURFX1NFVF9OQVRJVkVfTU9ERQorc3RhdGljIHVuc2lnbmVkIGludCBsb2NhbF9idXNlc1tdID0geyAwLCAwIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBjaV9pcnFfc3dpenpsZVsyXVtQQ0lfTUFYX0RFVklDRVNdID0geworCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAyNywgMjcsIFs5IC4uLiBQQ0lfTUFYX0RFVklDRVMgLSAxXSA9IDAgfSwKKwl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMjksIDI5LCBbOSAuLi4gUENJX01BWF9ERVZJQ0VTIC0gMV0gPSAwIH0sCit9OworCisKKyNpZmRlZiBERUJVRworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfYnVzX2xpc3RbXSA9IHsgUENJXzBfTU9ERSwgUENJXzFfTU9ERSB9Oworc3RhdGljIHZvaWQgZ3RfcGNpX2J1c19tb2RlX2Rpc3BsYXkgKFBDSV9IT1NUIGhvc3QpCit7CisJdW5zaWduZWQgaW50IG1vZGU7CisKKworCW1vZGUgPSAoR1RSRUdSRUFEIChwY2lfYnVzX2xpc3RbaG9zdF0pICYgKEJJVDQgfCBCSVQ1KSkgPj4gNDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCXByaW50ZiAoIlBDSSAlZCBidXMgbW9kZTogQ29udmVudGlvbmFsIFBDSVxuIiwgaG9zdCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJpbnRmICgiUENJICVkIGJ1cyBtb2RlOiA2NiBNaHogUENJWFxuIiwgaG9zdCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcHJpbnRmICgiUENJICVkIGJ1cyBtb2RlOiAxMDAgTWh6IFBDSVhcbiIsIGhvc3QpOworCQlicmVhazsKKwljYXNlIDM6CisJCXByaW50ZiAoIlBDSSAlZCBidXMgbW9kZTogMTMzIE1oeiBQQ0lYXG4iLCBob3N0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBCVVMgJWRcbiIsIG1vZGUpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbXSA9IHsKKwlQQ0lfMFAyUF9DT05GSUdVUkFUSU9OLCBQQ0lfMVAyUF9DT05GSUdVUkFUSU9OCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9jb25maWd1cmF0aW9uX2FkZHJlc3NbXSA9IHsKKwlQQ0lfMENPTkZJR1VSQVRJT05fQUREUkVTUywgUENJXzFDT05GSUdVUkFUSU9OX0FERFJFU1MKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2NvbmZpZ3VyYXRpb25fZGF0YVtdID0geworCVBDSV8wQ09ORklHVVJBVElPTl9EQVRBX1ZJUlRVQUxfUkVHSVNURVIsCisJUENJXzFDT05GSUdVUkFUSU9OX0RBVEFfVklSVFVBTF9SRUdJU1RFUgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfZXJyb3JfY2F1c2VfcmVnW10gPSB7CisJUENJXzBFUlJPUl9DQVVTRSwgUENJXzFFUlJPUl9DQVVTRQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfYXJiaXRlcl9jb250cm9sW10gPSB7CisJUENJXzBBUkJJVEVSX0NPTlRST0wsIFBDSV8xQVJCSVRFUl9DT05UUk9MCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9hZGRyZXNzX3NwYWNlX2VuW10gPSB7CisJUENJXzBfQkFTRV9BRERSX1JFR19FTkFCTEUsIFBDSV8xX0JBU0VfQUREUl9SRUdfRU5BQkxFCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9zbm9vcF9jb250cm9sX2Jhc2VfMF9sb3dbXSA9IHsKKwlQQ0lfMFNOT09QX0NPTlRST0xfQkFTRV8wX0xPVywgUENJXzFTTk9PUF9DT05UUk9MX0JBU0VfMF9MT1cKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9zbm9vcF9jb250cm9sX3RvcF8wW10gPSB7CisJUENJXzBTTk9PUF9DT05UUk9MX1RPUF8wLCBQQ0lfMVNOT09QX0NPTlRST0xfVE9QXzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2FjY2Vzc19jb250cm9sX2Jhc2VfMF9sb3dbXSA9IHsKKwlQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfMF9MT1csIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV8wX0xPVworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2FjY2Vzc19jb250cm9sX3RvcF8wW10gPSB7CisJUENJXzBBQ0NFU1NfQ09OVFJPTF9UT1BfMCwgUENJXzFBQ0NFU1NfQ09OVFJPTF9UT1BfMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfc2NzX2Jhbmtfc2l6ZVsyXVs0XSA9IHsKKwl7UENJXzBTQ1NfMF9CQU5LX1NJWkUsIFBDSV8wU0NTXzFfQkFOS19TSVpFLAorCSBQQ0lfMFNDU18yX0JBTktfU0laRSwgUENJXzBTQ1NfM19CQU5LX1NJWkV9LAorCXtQQ0lfMVNDU18wX0JBTktfU0laRSwgUENJXzFTQ1NfMV9CQU5LX1NJWkUsCisJIFBDSV8xU0NTXzJfQkFOS19TSVpFLCBQQ0lfMVNDU18zX0JBTktfU0laRX0KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX3AycF9jb25maWd1cmF0aW9uW10gPSB7CisJUENJXzBQMlBfQ09ORklHVVJBVElPTiwgUENJXzFQMlBfQ09ORklHVVJBVElPTgorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpV3JpdGVDb25maWdSZWcgLSBXcml0ZSB0byBhIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisqICAgICAgICAgICAgICAgICAgICAtIE1ha2Ugc3VyZSB0aGUgR1QgaXMgY29uZmlndXJlZCBhcyBhIG1hc3RlciBiZWZvcmUgd3JpdGluZworKiAgICAgICAgICAgICAgICAgICAgICB0byBhbm90aGVyIGRldmljZSBvbiB0aGUgUENJLgorKiAgICAgICAgICAgICAgICAgICAgLSBUaGUgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBCaWcvTGl0dGxlIGVuZGlhbiBjb252ZXJzaW9uLgorKgorKgorKiBJbnB1dHM6ICAgdW5zaWduZWQgaW50IHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMKKyogICAgICAgICAgICAgICAgICAgKG9yIGFueSBvdGhlciBQQ0kgZGV2aWNlIHNwZWMpCisqICAgICAgICAgICBwY2lEZXZOdW06IFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDB8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwY2lXcml0ZUNvbmZpZ1JlZyAoUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgaW50IHJlZ09mZnNldCwKKwkJCXVuc2lnbmVkIGludCBwY2lEZXZOdW0sIHVuc2lnbmVkIGludCBkYXRhKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEYXRhRm9yQWRkclJlZzsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25OdW07CisJdW5zaWduZWQgaW50IGJ1c051bSA9IDA7CisJdW5zaWduZWQgaW50IGFkZHI7CisKKwlpZiAocGNpRGV2TnVtID4gMzIpCS8qIGlsbGVnYWwgZGV2aWNlIE51bWJlciAqLworCQlyZXR1cm47CisJaWYgKHBjaURldk51bSA9PSBTRUxGKSB7CS8qIGNvbmZpZ3VyZSBvdXIgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKwkJcGNpRGV2TnVtID0KKwkJCShHVFJFR1JFQUQgKHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbaG9zdF0pID4+IDI0KSAmCisJCQkweDFmOworCQlidXNOdW0gPSBHVFJFR1JFQUQgKHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbaG9zdF0pICYKKwkJCTB4ZmYwMDAwOworCX0KKwlmdW5jdGlvbk51bSA9IHJlZ09mZnNldCAmIDB4MDAwMDA3MDA7CisJcGNpRGV2TnVtID0gcGNpRGV2TnVtIDw8IDExOworCXJlZ09mZnNldCA9IHJlZ09mZnNldCAmIDB4ZmM7CisJRGF0YUZvckFkZHJSZWcgPQorCQkocmVnT2Zmc2V0IHwgcGNpRGV2TnVtIHwgZnVuY3Rpb25OdW0gfCBidXNOdW0pIHwgQklUMzE7CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9hZGRyZXNzW2hvc3RdLCBEYXRhRm9yQWRkclJlZyk7CisJR1RfUkVHX1JFQUQgKHBjaV9jb25maWd1cmF0aW9uX2FkZHJlc3NbaG9zdF0sICZhZGRyKTsKKwlpZiAoYWRkciAhPSBEYXRhRm9yQWRkclJlZykKKwkJcmV0dXJuOworCUdUX1JFR19XUklURSAocGNpX2NvbmZpZ3VyYXRpb25fZGF0YVtob3N0XSwgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lSZWFkQ29uZmlnUmVnICAtIFJlYWQgZnJvbSBhIFBDSTAgY29uZmlndXJhdGlvbiByZWdpc3RlcgorKiAgICAgICAgICAgICAgICAgICAgLSBNYWtlIHN1cmUgdGhlIEdUIGlzIGNvbmZpZ3VyZWQgYXMgYSBtYXN0ZXIgYmVmb3JlIHJlYWRpbmcKKyogICAgICAgICAgICAgICAgICAgICBmcm9tIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBQQ0kuCisqICAgICAgICAgICAgICAgICAgIC0gVGhlIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgQmlnL0xpdHRsZSBlbmRpYW4gY29udmVyc2lvbi4KKyogSU5QVVRTOiAgIHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMgKG9yIFBDSQorKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMpCisqICAgICAgICAgICBwY2lEZXZOdW06IFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyogUkVUVVJOUzogZGF0YSAsIGlmIHRoZSBkYXRhID09IDB4ZmZmZmZmZmYgY2hlY2sgdGhlIG1hc3RlciBhYm9ydCBiaXQgaW4gdGhlCisqICAgICAgICAgICAgICAgICBjYXVzZSByZWdpc3RlciB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgdmFsaWQKKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDB8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjaVJlYWRDb25maWdSZWcgKFBDSV9IT1NUIGhvc3QsIHVuc2lnbmVkIGludCByZWdPZmZzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBjaURldk51bSkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGF0YUZvckFkZHJSZWc7CisJdW5zaWduZWQgaW50IGRhdGE7CisJdW5zaWduZWQgaW50IGZ1bmN0aW9uTnVtOworCXVuc2lnbmVkIGludCBidXNOdW0gPSAwOworCisJaWYgKHBjaURldk51bSA+IDMyKQkvKiBpbGxlZ2FsIGRldmljZSBOdW1iZXIgKi8KKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJaWYgKHBjaURldk51bSA9PSBTRUxGKSB7CS8qIGNvbmZpZ3VyZSBvdXIgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKwkJcGNpRGV2TnVtID0KKwkJCShHVFJFR1JFQUQgKHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbaG9zdF0pID4+IDI0KSAmCisJCQkweDFmOworCQlidXNOdW0gPSBHVFJFR1JFQUQgKHBjaV9wMnBfY29uZmlndXJhdGlvbl9yZWdbaG9zdF0pICYKKwkJCTB4ZmYwMDAwOworCX0KKwlmdW5jdGlvbk51bSA9IHJlZ09mZnNldCAmIDB4MDAwMDA3MDA7CisJcGNpRGV2TnVtID0gcGNpRGV2TnVtIDw8IDExOworCXJlZ09mZnNldCA9IHJlZ09mZnNldCAmIDB4ZmM7CisJRGF0YUZvckFkZHJSZWcgPQorCQkocmVnT2Zmc2V0IHwgcGNpRGV2TnVtIHwgZnVuY3Rpb25OdW0gfCBidXNOdW0pIHwgQklUMzE7CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9hZGRyZXNzW2hvc3RdLCBEYXRhRm9yQWRkclJlZyk7CisJR1RfUkVHX1JFQUQgKHBjaV9jb25maWd1cmF0aW9uX2FkZHJlc3NbaG9zdF0sICZkYXRhKTsKKwlpZiAoZGF0YSAhPSBEYXRhRm9yQWRkclJlZykKKwkJcmV0dXJuIDB4ZmZmZmZmZmY7CisJR1RfUkVHX1JFQUQgKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sICZkYXRhKTsKKwlyZXR1cm4gZGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaU92ZXJCcmlkZ2VXcml0ZUNvbmZpZ1JlZyAtIFdyaXRlIHRvIGEgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgd2hlcmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFnZW50IGlzIHBsYWNlZCBvbiBhbm90aGVyIEJ1cy4gRm9yIG1vcmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gcmVhZCBQMlAgaW4gdGhlIFBDSSBzcGVjLgorKgorKiBJbnB1dHM6ICAgdW5zaWduZWQgaW50IHJlZ09mZnNldCAtIFRoZSByZWdpc3RlciBvZmZzZXQgYXMgaXQgYXBlYXJzIGluIHRoZQorKiAgICAgICAgICAgR1Qgc3BlYyAob3IgYW55IG90aGVyIFBDSSBkZXZpY2Ugc3BlYykuCisqICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGNpRGV2TnVtIC0gVGhlIGRldmljZSBudW1iZXIgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgorKiAgICAgICAgICAgdW5zaWduZWQgaW50IGJ1c051bSAtIE9uIHdoaWNoIGJ1cyBkb2VzIHRoZSBUYXJnZXQgYWdlbnQgY29ubmVjdAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLgorKiAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGEgLSBkYXRhIHRvIGJlIHdyaXR0ZW4uCisqCisqICBDb25maWd1cmF0aW9uIEFkZHJlc3MgMHhDRjg6CisqCisqICAgICAgIDMxIDMwICAgIDI0IDIzICAxNiAxNSAgMTEgMTAgICAgIDggNyAgICAgIDIgIDAgICAgIDw9Yml0IE51bWJlcgorKiAgfGNvbmdpZnxSZXNlcnZlZHwgIEJ1cyB8RGV2aWNlfEZ1bmN0aW9ufFJlZ2lzdGVyfDAxfAorKiAgfEVuYWJsZXwgICAgICAgIHxOdW1iZXJ8TnVtYmVyfCBOdW1iZXIgfCBOdW1iZXIgfCAgfCAgICA8PWZpZWxkIE5hbWUKKyoKKyogIFRoZSBjb25maWd1cmF0aW9uIEFkZHJlc3MgaXMgY29uZmlndXJlIGFzIHR5cGUtSSAoYml0c1sxOjBdID0gJzAxJykgZHVlIHRvCisqICAgUENJIHNwZWMgcmVmZXJyaW5nIHRvIFAyUC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGNpT3ZlckJyaWRnZVdyaXRlQ29uZmlnUmVnIChQQ0lfSE9TVCBob3N0LAorCQkJCSAgdW5zaWduZWQgaW50IHJlZ09mZnNldCwKKwkJCQkgIHVuc2lnbmVkIGludCBwY2lEZXZOdW0sCisJCQkJICB1bnNpZ25lZCBpbnQgYnVzTnVtLCB1bnNpZ25lZCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgRGF0YUZvclJlZzsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25OdW07CisKKwlmdW5jdGlvbk51bSA9IHJlZ09mZnNldCAmIDB4MDAwMDA3MDA7CisJcGNpRGV2TnVtID0gcGNpRGV2TnVtIDw8IDExOworCXJlZ09mZnNldCA9IHJlZ09mZnNldCAmIDB4ZmY7CisJYnVzTnVtID0gYnVzTnVtIDw8IDE2OworCWlmIChwY2lEZXZOdW0gPT0gU0VMRikgewkvKiBUaGlzIGJvYXJkICovCisJCURhdGFGb3JSZWcgPSAocmVnT2Zmc2V0IHwgcGNpRGV2TnVtIHwgZnVuY3Rpb25OdW0pIHwgQklUMDsKKwl9IGVsc2UgeworCQlEYXRhRm9yUmVnID0gKHJlZ09mZnNldCB8IHBjaURldk51bSB8IGZ1bmN0aW9uTnVtIHwgYnVzTnVtKSB8CisJCQlCSVQzMSB8IEJJVDA7CisJfQorCUdUX1JFR19XUklURSAocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgRGF0YUZvclJlZyk7CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9kYXRhW2hvc3RdLCBkYXRhKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpT3ZlckJyaWRnZVJlYWRDb25maWdSZWcgIC0gUmVhZCBmcm9tIGEgUENJbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHdoZXJlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhZ2VudCB0YXJnZXQgbG9jYXRlIG9uIGFub3RoZXIgUENJIGJ1cy4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTWFrZSBzdXJlIHRoZSBHVCBpcyBjb25maWd1cmVkIGFzIGEgbWFzdGVyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSByZWFkaW5nIGZyb20gYW5vdGhlciBkZXZpY2Ugb24gdGhlIFBDSS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVGhlIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgQmlnL0xpdHRsZSBlbmRpYW4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbi4KKyogSU5QVVRTOiAgIHJlZ09mZnNldDogVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlIEdUIHNwZWMgKG9yIFBDSQorKiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMpLiAoY29uZmlndXJhdGlvbiByZWdpc3RlciBvZmZzZXQuKQorKiAgICAgICAgICAgcGNpRGV2TnVtOiBUaGUgZGV2aWNlIG51bWJlciBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCisqICAgICAgICAgICBidXNOdW06IHRoZSBCdXMgbnVtYmVyIHdoZXJlIHRoZSBhZ2VudCBpcyBwbGFjZS4KKyogUkVUVVJOUzogZGF0YSAsIGlmIHRoZSBkYXRhID09IDB4ZmZmZmZmZmYgY2hlY2sgdGhlIG1hc3RlciBhYm9ydCBiaXQgaW4gdGhlCisqICAgICAgICAgICAgICAgICBjYXVzZSByZWdpc3RlciB0byBtYWtlIHN1cmUgdGhlIGRhdGEgaXMgdmFsaWQKKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDF8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjaU92ZXJCcmlkZ2VSZWFkQ29uZmlnUmVnIChQQ0lfSE9TVCBob3N0LAorCQkJCQkgdW5zaWduZWQgaW50IHJlZ09mZnNldCwKKwkJCQkJIHVuc2lnbmVkIGludCBwY2lEZXZOdW0sCisJCQkJCSB1bnNpZ25lZCBpbnQgYnVzTnVtKQoreworCXVuc2lnbmVkIGludCBEYXRhRm9yUmVnOworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCBmdW5jdGlvbk51bTsKKworCWZ1bmN0aW9uTnVtID0gcmVnT2Zmc2V0ICYgMHgwMDAwMDcwMDsKKwlwY2lEZXZOdW0gPSBwY2lEZXZOdW0gPDwgMTE7CisJcmVnT2Zmc2V0ID0gcmVnT2Zmc2V0ICYgMHhmZjsKKwlidXNOdW0gPSBidXNOdW0gPDwgMTY7CisJaWYgKHBjaURldk51bSA9PSBTRUxGKSB7CS8qIFRoaXMgYm9hcmQgKi8KKwkJRGF0YUZvclJlZyA9IChyZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSkgfCBCSVQzMTsKKwl9IGVsc2UgewkJLyogYWdlbnQgb24gYW5vdGhlciBidXMgKi8KKworCQlEYXRhRm9yUmVnID0gKHJlZ09mZnNldCB8IHBjaURldk51bSB8IGZ1bmN0aW9uTnVtIHwgYnVzTnVtKSB8CisJCQlCSVQwIHwgQklUMzE7CisJfQorCUdUX1JFR19XUklURSAocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgRGF0YUZvclJlZyk7CisJR1RfUkVHX1JFQUQgKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sICZkYXRhKTsKKwlyZXR1cm4gZGF0YTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpR2V0UmVnT2Zmc2V0IC0gR2V0cyB0aGUgcmVnaXN0ZXIgb2Zmc2V0IGZvciB0aGlzIHJlZ2lvbiBjb25maWcuCisqCisqIElOUFVUOiAgIEJ1cywgUmVnaW9uIC0gVGhlIGJ1cyBhbmQgcmVnaW9uIHdlIGFzayBmb3IgaXRzIGJhc2UgYWRkcmVzcy4KKyogT1VUUFVUOiAgIE4vQQorKiBSRVRVUk5TOiBQQ0kgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjaUdldFJlZ09mZnNldCAoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24pCit7CisJc3dpdGNoIChob3N0KSB7CisJY2FzZSBQQ0lfSE9TVDA6CisJCXN3aXRjaCAocmVnaW9uKSB7CisJCWNhc2UgUENJX0lPOgorCQkJcmV0dXJuIFBDSV8wSV9PX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMDoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04xOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjI6CisJCQlyZXR1cm4gUENJXzBNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMzoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOworCQl9CisJY2FzZSBQQ0lfSE9TVDE6CisJCXN3aXRjaCAocmVnaW9uKSB7CisJCWNhc2UgUENJX0lPOgorCQkJcmV0dXJuIFBDSV8xSV9PX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMDoKKwkJCXJldHVybiBQQ0lfMU1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04xOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjI6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkyX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMzoKKwkJCXJldHVybiBQQ0lfMU1FTU9SWTNfTE9XX0RFQ09ERV9BRERSRVNTOworCQl9CisJfQorCXJldHVybiBQQ0lfME1FTU9SWTBfTE9XX0RFQ09ERV9BRERSRVNTOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBjaUdldFJlbWFwT2Zmc2V0IChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbikKK3sKKwlzd2l0Y2ggKGhvc3QpIHsKKwljYXNlIFBDSV9IT1NUMDoKKwkJc3dpdGNoIChyZWdpb24pIHsKKwkJY2FzZSBQQ0lfSU86CisJCQlyZXR1cm4gUENJXzBJX09fQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMDoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTBfQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMToKKwkJCXJldHVybiBQQ0lfME1FTU9SWTFfQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMjoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTJfQUREUkVTU19SRU1BUDsKKwkJY2FzZSBQQ0lfUkVHSU9OMzoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTNfQUREUkVTU19SRU1BUDsKKwkJfQorCWNhc2UgUENJX0hPU1QxOgorCQlzd2l0Y2ggKHJlZ2lvbikgeworCQljYXNlIFBDSV9JTzoKKwkJCXJldHVybiBQQ0lfMUlfT19BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04wOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZMF9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04xOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZMV9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04yOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZMl9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04zOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZM19BRERSRVNTX1JFTUFQOworCQl9CisJfQorCXJldHVybiBQQ0lfME1FTU9SWTBfQUREUkVTU19SRU1BUDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaUdldEJhc2VBZGRyZXNzIC0gR2V0cyB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgUENJLgorKiAgICAgICAgICAgLSBJZiB0aGUgUENJIHNpemUgaXMgMCB0aGVuIHRoaXMgYmFzZSBhZGRyZXNzIGhhcyBubyBtZWFuaW5nISEhCisqCisqCisqIElOUFVUOiAgIEJ1cywgUmVnaW9uIC0gVGhlIGJ1cyBhbmQgcmVnaW9uIHdlIGFzayBmb3IgaXRzIGJhc2UgYWRkcmVzcy4KKyogT1VUUFVUOiAgIE4vQQorKiBSRVRVUk5TOiBQQ0kgYmFzZSBhZGRyZXNzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordW5zaWduZWQgaW50IHBjaUdldEJhc2VBZGRyZXNzIChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnQmFzZTsKKwl1bnNpZ25lZCBpbnQgcmVnRW5kOworCXVuc2lnbmVkIGludCByZWdPZmZzZXQgPSBwY2lHZXRSZWdPZmZzZXQgKGhvc3QsIHJlZ2lvbik7CisKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0LCAmcmVnQmFzZSk7CisJR1RfUkVHX1JFQUQgKHJlZ09mZnNldCArIDgsICZyZWdFbmQpOworCisJaWYgKHJlZ0VuZCA8PSByZWdCYXNlKQorCQlyZXR1cm4gMHhmZmZmZmZmZjsJLyogRVJST1IgISEhICovCisKKwlyZWdCYXNlID0gcmVnQmFzZSA8PCAxNjsKKwlyZXR1cm4gcmVnQmFzZTsKK30KKworYm9vbCBwY2lNYXBTcGFjZSAoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24sIHVuc2lnbmVkIGludCByZW1hcEJhc2UsCisJCSAgdW5zaWduZWQgaW50IGJhbmtCYXNlLCB1bnNpZ25lZCBpbnQgYmFua0xlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgbG93ID0gMHhmZmY7CisJdW5zaWduZWQgaW50IGhpZ2ggPSAweDA7CisJdW5zaWduZWQgaW50IHJlZ09mZnNldCA9IHBjaUdldFJlZ09mZnNldCAoaG9zdCwgcmVnaW9uKTsKKwl1bnNpZ25lZCBpbnQgcmVtYXBPZmZzZXQgPSBwY2lHZXRSZW1hcE9mZnNldCAoaG9zdCwgcmVnaW9uKTsKKworCWlmIChiYW5rTGVuZ3RoICE9IDApIHsKKwkJbG93ID0gKGJhbmtCYXNlID4+IDE2KSAmIDB4ZmZmZjsKKwkJaGlnaCA9ICgoYmFua0Jhc2UgKyBiYW5rTGVuZ3RoKSA+PiAxNikgLSAxOworCX0KKworCUdUX1JFR19XUklURSAocmVnT2Zmc2V0LCBsb3cgfCAoMSA8PCAyNCkpOwkvKiBubyBzd2FwcGluZyAqLworCUdUX1JFR19XUklURSAocmVnT2Zmc2V0ICsgOCwgaGlnaCk7CisKKwlpZiAoYmFua0xlbmd0aCAhPSAwKSB7CS8qIG11c3QgZG8gQUZURVIgd3JpdGluZyBtYXBzICovCisJCUdUX1JFR19XUklURSAocmVtYXBPZmZzZXQsIHJlbWFwQmFzZSA+PiAxNik7CS8qIHNvcnJ5LCAzMiBiaXRzIG9ubHkuCisJCQkJCQkJCSAgIGRvbnQgc3VwcG9ydCB1cHBlciAzMgorCQkJCQkJCQkgICBpbiB0aGlzIGRyaXZlciAqLworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwordW5zaWduZWQgaW50IHBjaUdldFNwYWNlQmFzZSAoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24pCit7CisJdW5zaWduZWQgaW50IGxvdzsKKwl1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0ID0gcGNpR2V0UmVnT2Zmc2V0IChob3N0LCByZWdpb24pOworCisJR1RfUkVHX1JFQUQgKHJlZ09mZnNldCwgJmxvdyk7CisJcmV0dXJuIChsb3cgJiAweGZmZmYpIDw8IDE2OworfQorCit1bnNpZ25lZCBpbnQgcGNpR2V0U3BhY2VTaXplIChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbikKK3sKKwl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXVuc2lnbmVkIGludCByZWdPZmZzZXQgPSBwY2lHZXRSZWdPZmZzZXQgKGhvc3QsIHJlZ2lvbik7CisKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0LCAmbG93KTsKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0ICsgOCwgJmhpZ2gpOworCXJldHVybiAoKGhpZ2ggJiAweGZmZmYpICsgMSkgPDwgMTY7Cit9CisKKworLyogcm9uZW4gLSA3L0RlYy8wMyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZ3RQY2lEaXNhYmxlL0VuYWJsZUludGVybmFsQkFSIC0gVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSBQQ0kgQkFSUy4KKyogSW5wdXRzOiBvbmUgb2YgdGhlIFBDSSBCQVIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ3RQY2lFbmFibGVJbnRlcm5hbEJBUiAoUENJX0hPU1QgaG9zdCwgUENJX0lOVEVSTkFMX0JBUiBwY2lCQVIpCit7CisJUkVTRVRfUkVHX0JJVFMgKHBjaV9hZGRyZXNzX3NwYWNlX2VuW2hvc3RdLCBCSVQwIDw8IHBjaUJBUik7Cit9CisKK3ZvaWQgZ3RQY2lEaXNhYmxlSW50ZXJuYWxCQVIgKFBDSV9IT1NUIGhvc3QsIFBDSV9JTlRFUk5BTF9CQVIgcGNpQkFSKQoreworCVNFVF9SRUdfQklUUyAocGNpX2FkZHJlc3Nfc3BhY2VfZW5baG9zdF0sIEJJVDAgPDwgcGNpQkFSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaU1hcE1lbW9yeUJhbmsgLSBNYXBzIFBDSV9ob3N0IG1lbW9yeSBiYW5rICJiYW5rIiBmb3IgdGhlIHNsYXZlLgorKgorKiBJbnB1dHM6IGJhc2UgYW5kIHNpemUgb2YgUENJIFNDUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwY2lNYXBNZW1vcnlCYW5rIChQQ0lfSE9TVCBob3N0LCBNRU1PUllfQkFOSyBiYW5rLAorCQkgICAgICAgdW5zaWduZWQgaW50IHBjaURyYW1CYXNlLCB1bnNpZ25lZCBpbnQgcGNpRHJhbVNpemUpCit7CisJLypyb25lbiBkaWZmZXJlbnQgZnVuY3Rpb24gZm9yIDNyZCBiYW5rLiAqLworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAoYmFuayA8IDIpID8gYmFuayAqIDggOiAweDEwMCArIChiYW5rIC0gMikgKiA4OworCisJcGNpRHJhbUJhc2UgPSBwY2lEcmFtQmFzZSAmIDB4ZmZmZmYwMDA7CisJcGNpRHJhbUJhc2UgPSBwY2lEcmFtQmFzZSB8IChwY2lSZWFkQ29uZmlnUmVnIChob3N0LAorCQkJCQkJICAgICAgIFBDSV9TQ1NfMF9CQVNFX0FERFJFU1MKKwkJCQkJCSAgICAgICArIG9mZnNldCwKKwkJCQkJCSAgICAgICBTRUxGKSAmIDB4MDAwMDBmZmYpOworCXBjaVdyaXRlQ29uZmlnUmVnIChob3N0LCBQQ0lfU0NTXzBfQkFTRV9BRERSRVNTICsgb2Zmc2V0LCBTRUxGLAorCQkJICAgcGNpRHJhbUJhc2UpOworCWlmIChwY2lEcmFtU2l6ZSA9PSAwKQorCQlwY2lEcmFtU2l6ZSsrOworCUdUX1JFR19XUklURSAocGNpX3Njc19iYW5rX3NpemVbaG9zdF1bYmFua10sIHBjaURyYW1TaXplIC0gMSk7CisJZ3RQY2lFbmFibGVJbnRlcm5hbEJBUiAoaG9zdCwgYmFuayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lTZXRSZWdpb25GZWF0dXJlcyAtIFRoaXMgZnVuY3Rpb24gbW9kaWZ5cyBvbmUgb2YgdGhlIDggcmVnaW9ucyB3aXRoCisqICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgYml0cyBnaXZlbiBhcyBhbiBpbnB1dC4KKyogICAgICAgICAgICAgICAgICAgICAgIC0gQmUgYWR2aXNlZCB0byBjaGVjayB0aGUgc3BlYyBiZWZvcmUgbW9kaWZ5aW5nIHRoZW0uCisqIElucHV0czogUENJX1BST1RFQ1RfUkVHSU9OIHJlZ2lvbiAtIG9uZSBvZiB0aGUgZWlnaHQgcmVnaW9ucy4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgZmVhdHVyZXMgLSBTZWUgZmlsZTogcGNpLmggdGhlcmUgYXJlIGRlZmludGlvbiBmb3IgdGhvc2UKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gZmVhdHVyZXMuCisqICAgICAgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzIC0gVGhlIHJlZ2lvbiBiYXNlIEFkZHJlc3MuCisqICAgICAgICAgdW5zaWduZWQgaW50IHRvcEFkZHJlc3MgLSBUaGUgcmVnaW9uIHRvcCBBZGRyZXNzLgorKiBSZXR1cm5zOiBmYWxzZSBpZiBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgaXMgZXJyb25lb3VzIHRydWUgb3RoZXJ3aXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lTZXRSZWdpb25GZWF0dXJlcyAoUENJX0hPU1QgaG9zdCwgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbiwKKwkJCSAgIHVuc2lnbmVkIGludCBmZWF0dXJlcywgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLAorCQkJICAgdW5zaWduZWQgaW50IHJlZ2lvbkxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgYWNjZXNzTG93OworCXVuc2lnbmVkIGludCBhY2Nlc3NIaWdoOworCXVuc2lnbmVkIGludCBhY2Nlc3NUb3AgPSBiYXNlQWRkcmVzcyArIHJlZ2lvbkxlbmd0aDsKKworCWlmIChyZWdpb25MZW5ndGggPT0gMCkgewkvKiBjbG9zZSB0aGUgcmVnaW9uLiAqLworCQlwY2lEaXNhYmxlQWNjZXNzUmVnaW9uIChob3N0LCByZWdpb24pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogYmFzZSBBZGRyZXNzIGlzIHN0b3JlIGlzIGJpdHMgWzExOjBdICovCisJYWNjZXNzTG93ID0gKGJhc2VBZGRyZXNzICYgMHhmZmYwMDAwMCkgPj4gMjA7CisJLyogQWxsIHRoZSBmZWF0dXJlcyBhcmUgdXBkYXRlIGFjY29yZGluZyB0byB0aGUgZGVmaW5lcyBpbiBwY2kuaCAodG8gYmUgb24KKwkgICB0aGUgc2FmZSBzaWRlIHdlIGRpc2FibGUgYml0czogWzExOjBdICovCisJYWNjZXNzTG93ID0gYWNjZXNzTG93IHwgKGZlYXR1cmVzICYgMHhmZmZmZjAwMCk7CisJLyogd3JpdGUgdG8gdGhlIExvdyBBY2Nlc3MgUmVnaW9uIHJlZ2lzdGVyICovCisJR1RfUkVHX1dSSVRFIChwY2lfYWNjZXNzX2NvbnRyb2xfYmFzZV8wX2xvd1tob3N0XSArIDB4MTAgKiByZWdpb24sCisJCSAgICAgIGFjY2Vzc0xvdyk7CisKKwlhY2Nlc3NIaWdoID0gKGFjY2Vzc1RvcCAmIDB4ZmZmMDAwMDApID4+IDIwOworCisJLyogd3JpdGUgdG8gdGhlIEhpZ2ggQWNjZXNzIFJlZ2lvbiByZWdpc3RlciAqLworCUdUX1JFR19XUklURSAocGNpX2FjY2Vzc19jb250cm9sX3RvcF8wW2hvc3RdICsgMHgxMCAqIHJlZ2lvbiwKKwkJICAgICAgYWNjZXNzSGlnaCAtIDEpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpRGlzYWJsZUFjY2Vzc1JlZ2lvbiAtIERpc2FibGUgVGhlIGdpdmVuIFJlZ2lvbiBieSB3cml0aW5nIE1BWCBzaXplCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIGxvdyBBZGRyZXNzIGFuZCBNSU4gc2l6ZSB0byBpdHMgaGlnaCBBZGRyZXNzLgorKgorKiBJbnB1dHM6ICAgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbiAtIFRoZSByZWdpb24gd2UgdG8gYmUgRGlzYWJsZWQuCisqIFJldHVybnM6ICBOL0EuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaURpc2FibGVBY2Nlc3NSZWdpb24gKFBDSV9IT1NUIGhvc3QsIFBDSV9BQ0NFU1NfUkVHSU9OUyByZWdpb24pCit7CisJLyogd3JpdGluZyBiYWNrIHRoZSByZWdpc3RlcnMgZGVmYXVsdCB2YWx1ZXMuICovCisJR1RfUkVHX1dSSVRFIChwY2lfYWNjZXNzX2NvbnRyb2xfYmFzZV8wX2xvd1tob3N0XSArIDB4MTAgKiByZWdpb24sCisJCSAgICAgIDB4MDEwMDFmZmYpOworCUdUX1JFR19XUklURSAocGNpX2FjY2Vzc19jb250cm9sX3RvcF8wW2hvc3RdICsgMHgxMCAqIHJlZ2lvbiwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lBcmJpdGVyRW5hYmxlIC0gRW5hYmxlcyBQQ0ktMGBzIEFyYml0cmF0aW9uIG1lY2hhbmlzbS4KKyoKKyogSW5wdXRzOiAgIE4vQQorKiBSZXR1cm5zOiAgdHJ1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpQXJiaXRlckVuYWJsZSAoUENJX0hPU1QgaG9zdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnRGF0YTsKKworCUdUX1JFR19SRUFEIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCAmcmVnRGF0YSk7CisJR1RfUkVHX1dSSVRFIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCByZWdEYXRhIHwgQklUMzEpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpQXJiaXRlckRpc2FibGUgLSBEaXNhYmxlIFBDSS0wYHMgQXJiaXRyYXRpb24gbWVjaGFuaXNtLgorKgorKiBJbnB1dHM6ICAgTi9BCisqIFJldHVybnM6ICB0cnVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaUFyYml0ZXJEaXNhYmxlIChQQ0lfSE9TVCBob3N0KQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCisJR1RfUkVHX1JFQUQgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sICZyZWdEYXRhKTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sIHJlZ0RhdGEgJiAweDdmZmZmZmZmKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVNldEFyYml0ZXJBZ2VudHNQcmlvcml0eSAtIFByaW9yaXR5IHNldHVwIGZvciB0aGUgUENJIGFnZW50cyAoSGkgb3IgTG93KQorKgorKiBJbnB1dHM6ICAgUENJX0FHRU5UX1BSSU8gaW50ZXJuYWxBZ2VudCAtIHByaW90aXR5IGZvciBpbnRlcm5hbCBhZ2VudC4KKyogICAgICAgICAgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQwIC0gcHJpb3RpdHkgZm9yIGV4dGVybmFsIzAgYWdlbnQuCisqICAgICAgICAgICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MSAtIHByaW90aXR5IGZvciBleHRlcm5hbCMxIGFnZW50LgorKiAgICAgICAgICAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDIgLSBwcmlvdGl0eSBmb3IgZXh0ZXJuYWwjMiBhZ2VudC4KKyogICAgICAgICAgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQzIC0gcHJpb3RpdHkgZm9yIGV4dGVybmFsIzMgYWdlbnQuCisqICAgICAgICAgICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50NCAtIHByaW90aXR5IGZvciBleHRlcm5hbCM0IGFnZW50LgorKiAgICAgICAgICAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDUgLSBwcmlvdGl0eSBmb3IgZXh0ZXJuYWwjNSBhZ2VudC4KKyogUmV0dXJuczogIHRydWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpU2V0QXJiaXRlckFnZW50c1ByaW9yaXR5IChQQ0lfSE9TVCBob3N0LCBQQ0lfQUdFTlRfUFJJTyBpbnRlcm5hbEFnZW50LAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDAsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MSwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQyLAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDMsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50NCwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQ1KQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCXVuc2lnbmVkIGludCB3cml0ZURhdGE7CisKKwlHVF9SRUdfUkVBRCAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgJnJlZ0RhdGEpOworCXdyaXRlRGF0YSA9IChpbnRlcm5hbEFnZW50IDw8IDcpICsgKGV4dGVybmFsQWdlbnQwIDw8IDgpICsKKwkJKGV4dGVybmFsQWdlbnQxIDw8IDkpICsgKGV4dGVybmFsQWdlbnQyIDw8IDEwKSArCisJCShleHRlcm5hbEFnZW50MyA8PCAxMSkgKyAoZXh0ZXJuYWxBZ2VudDQgPDwgMTIpICsKKwkJKGV4dGVybmFsQWdlbnQ1IDw8IDEzKTsKKwlyZWdEYXRhID0gKHJlZ0RhdGEgJiAweGZmZmZjMDdmKSB8IHdyaXRlRGF0YTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sIHJlZ0RhdGEgJiByZWdEYXRhKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVBhcmtpbmdEaXNhYmxlIC0gUGFyayBvbiBsYXN0IG9wdGlvbiBkaXNhYmxlLCB3aXRoIHRoaXMgZnVuY3Rpb24geW91IGNhbgorKiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlIHRoZSBwYXJrIG9uIGxhc3QgbWVjaGFuaXNtIGZvciBlYWNoIGFnZW50LgorKiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxpbmcgdGhpcyBvcHRpb24gZm9yIGFsbCBhZ2VudHMgcmVzdWx0cyBwYXJraW5nCisqICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBpbnRlcm5hbCBtYXN0ZXIuCisqCisqIElucHV0czogUENJX0FHRU5UX1BBUksgaW50ZXJuYWxBZ2VudCAtICBwYXJraW5nIERpc2FibGUgZm9yIGludGVybmFsIGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQwIC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCMwIGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQxIC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCMxIGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQyIC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCMyIGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQzIC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCMzIGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQ0IC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCM0IGFnZW50LgorKiAgICAgICAgIFBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQ1IC0gcGFya2luZyBEaXNhYmxlIGZvciBleHRlcm5hbCM1IGFnZW50LgorKiBSZXR1cm5zOiAgdHJ1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lQYXJraW5nRGlzYWJsZSAoUENJX0hPU1QgaG9zdCwgUENJX0FHRU5UX1BBUksgaW50ZXJuYWxBZ2VudCwKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQwLAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDEsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MiwKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQzLAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDQsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50NSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnRGF0YTsKKwl1bnNpZ25lZCBpbnQgd3JpdGVEYXRhOworCisJR1RfUkVHX1JFQUQgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sICZyZWdEYXRhKTsKKwl3cml0ZURhdGEgPSAoaW50ZXJuYWxBZ2VudCA8PCAxNCkgKyAoZXh0ZXJuYWxBZ2VudDAgPDwgMTUpICsKKwkJKGV4dGVybmFsQWdlbnQxIDw8IDE2KSArIChleHRlcm5hbEFnZW50MiA8PCAxNykgKworCQkoZXh0ZXJuYWxBZ2VudDMgPDwgMTgpICsgKGV4dGVybmFsQWdlbnQ0IDw8IDE5KSArCisJCShleHRlcm5hbEFnZW50NSA8PCAyMCk7CisJcmVnRGF0YSA9IChyZWdEYXRhICYgfigweDdmIDw8IDE0KSkgfCB3cml0ZURhdGE7CisJR1RfUkVHX1dSSVRFIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCByZWdEYXRhKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaUVuYWJsZUJyb2tlbkFnZW50RGV0ZWN0aW9uIC0gQSBtYXN0ZXIgaXMgc2FpZCB0byBiZSBicm9rZW4gaWYgaXQgZmFpbHMgdG8KKyogICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQgdG8gZ3JhbnQgYXNzZXJ0aW9uIHdpdGhpbiBhIHdpbmRvdyBzcGVjaWZpZWQgaW4KKyogICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCB2YWx1ZTogJ2Jyb2tlblZhbHVlJy4KKyoKKyogSW5wdXRzOiB1bnNpZ25lZCBjaGFyIGJyb2tlblZhbHVlIC0gIEEgdmFsdWUgd2hpY2ggbGltaXRzIHRoZSBNYXN0ZXIgdG8gaG9sZCB0aGUKKyogICAgICAgICAgICAgICAgICAgICAgIGdyYW50IHdpdGhvdXQgYXNzZXJ0aW5nIGZyYW1lLgorKiBSZXR1cm5zOiAgRXJyb3IgZm9yIGlsbGVnYWwgYnJva2VuIHZhbHVlIG90aGVyd2lzZSB0cnVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lFbmFibGVCcm9rZW5BZ2VudERldGVjdGlvbiAoUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgY2hhciBicm9rZW5WYWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmVnRGF0YTsKKworCWlmIChicm9rZW5WYWx1ZSA+IDB4ZikKKwkJcmV0dXJuIGZhbHNlOwkvKiBicm9rZW5WYWx1ZSBtdXN0IGJlIDQgYml0ICovCisJZGF0YSA9IGJyb2tlblZhbHVlIDw8IDM7CisJR1RfUkVHX1JFQUQgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sICZyZWdEYXRhKTsKKwlyZWdEYXRhID0gKHJlZ0RhdGEgJiAweGZmZmZmZjg3KSB8IGRhdGE7CisJR1RfUkVHX1dSSVRFIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCByZWdEYXRhIHwgQklUMSk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lEaXNhYmxlQnJva2VuQWdlbnREZXRlY3Rpb24gLSBUaGlzIGZ1bmN0aW9uIGRpc2FibGUgdGhlIEJyb2tlbiBhZ2VudAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVjdGlvbiBtZWNoYW5pc20uCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogVGhpcyBvcGVyYXRpb24gbWF5IGNhdXNlIGEgZGVhZCBsb2NrIG9uIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaTAgYXJiaXRyYXRpb24uCisqCisqIElucHV0czogICBOL0EKKyogUmV0dXJuczogIHRydWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaURpc2FibGVCcm9rZW5BZ2VudERldGVjdGlvbiAoUENJX0hPU1QgaG9zdCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnRGF0YTsKKworCUdUX1JFR19SRUFEIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCAmcmVnRGF0YSk7CisJcmVnRGF0YSA9IHJlZ0RhdGEgJiAweGZmZmZmZmZkOworCUdUX1JFR19XUklURSAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgcmVnRGF0YSk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lQMlBDb25maWcgLSBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgUENJX24gUDJQIGNvbmZpZ3VyYXRlLgorKiAgICAgICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIFAyUCByZWFkIFBDSSBzcGVjLgorKgorKiBJbnB1dHM6ICB1bnNpZ25lZCBpbnQgU2Vjb25kQnVzTG93IC0gU2Vjb25kZXJ5IFBDSSBpbnRlcmZhY2UgQnVzIFJhbmdlIExvd2VyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZHJ5LgorKiAgICAgICAgICB1bnNpZ25lZCBpbnQgU2Vjb25kQnVzSGlnaCAtIFNlY29uZHJ5IFBDSSBpbnRlcmZhY2UgQnVzIFJhbmdlIHVwcGVyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZHJ5LgorKiAgICAgICAgICB1bnNpZ25lZCBpbnQgYnVzTnVtIC0gVGhlIENQSSBidXMgbnVtYmVyIHRvIHdoaWNoIHRoZSBQQ0kgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjb25uZWN0ZWQuCisqICAgICAgICAgIHVuc2lnbmVkIGludCBkZXZOdW0gLSBUaGUgUENJIGludGVyZmFjZSdzIGRldmljZSBudW1iZXIuCisqCisqIFJldHVybnM6ICB0cnVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lQMlBDb25maWcgKFBDSV9IT1NUIGhvc3QsIHVuc2lnbmVkIGludCBTZWNvbmRCdXNMb3csCisJCSAgIHVuc2lnbmVkIGludCBTZWNvbmRCdXNIaWdoLAorCQkgICB1bnNpZ25lZCBpbnQgYnVzTnVtLCB1bnNpZ25lZCBpbnQgZGV2TnVtKQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCisJcmVnRGF0YSA9IChTZWNvbmRCdXNMb3cgJiAweGZmKSB8ICgoU2Vjb25kQnVzSGlnaCAmIDB4ZmYpIDw8IDgpIHwKKwkJKChidXNOdW0gJiAweGZmKSA8PCAxNikgfCAoKGRldk51bSAmIDB4MWYpIDw8IDI0KTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9wMnBfY29uZmlndXJhdGlvbltob3N0XSwgcmVnRGF0YSk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lTZXRSZWdpb25Tbm9vcE1vZGUgLSBUaGlzIGZ1bmN0aW9uIG1vZGlmeXMgb25lIG9mIHRoZSA0IHJlZ2lvbnMgd2hpY2gKKyogICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIENhY2hlIENvaGVyZW5jeSBpbiB0aGUgUENJX24gaW50ZXJmYWNlLgorKiBJbnB1dHM6IHJlZ2lvbiAtIE9uZSBvZiB0aGUgZm91ciByZWdpb25zLgorKiAgICAgICAgIHNub29wVHlwZSAtIFRoZXJlIGlzIGZvdXIgb3B0aW9uYWwgVHlwZXM6CisqICAgICAgICAgICAgICAgICAgICAgICAgMS4gTm8gU25vb3AuCisqICAgICAgICAgICAgICAgICAgICAgICAgMi4gU25vb3AgdG8gV1QgcmVnaW9uLgorKiAgICAgICAgICAgICAgICAgICAgICAgIDMuIFNub29wIHRvIFdCIHJlZ2lvbi4KKyogICAgICAgICAgICAgICAgICAgICAgICA0LiBTbm9vcCAmIEludmFsaWRhdGUgdG8gV0IgcmVnaW9uLgorKiAgICAgICAgIGJhc2VBZGRyZXNzIC0gQmFzZSBBZGRyZXNzIG9mIHRoaXMgcmVnaW9uLgorKiAgICAgICAgIHJlZ2lvbkxlbmd0aCAtIFJlZ2lvbiBsZW5ndGguCisqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyB3cm9uZyBvdGhlcndpc2UgcmV0dXJuIHRydWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVNldFJlZ2lvblNub29wTW9kZSAoUENJX0hPU1QgaG9zdCwgUENJX1NOT09QX1JFR0lPTiByZWdpb24sCisJCQkgICAgUENJX1NOT09QX1RZUEUgc25vb3BUeXBlLAorCQkJICAgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBzbm9vcFhiYXNlQWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgc25vb3BYdG9wQWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgc25vb3BIaWdoID0gYmFzZUFkZHJlc3MgKyByZWdpb25MZW5ndGg7CisKKwlpZiAoKHJlZ2lvbiA+IFBDSV9TTk9PUF9SRUdJT04zKSB8fCAoc25vb3BUeXBlID4gUENJX1NOT09QX1dCKSkKKwkJcmV0dXJuIGZhbHNlOworCXNub29wWGJhc2VBZGRyZXNzID0KKwkJcGNpX3Nub29wX2NvbnRyb2xfYmFzZV8wX2xvd1tob3N0XSArIDB4MTAgKiByZWdpb247CisJc25vb3BYdG9wQWRkcmVzcyA9IHBjaV9zbm9vcF9jb250cm9sX3RvcF8wW2hvc3RdICsgMHgxMCAqIHJlZ2lvbjsKKwlpZiAocmVnaW9uTGVuZ3RoID09IDApIHsJLyogY2xvc2luZyB0aGUgcmVnaW9uICovCisJCUdUX1JFR19XUklURSAoc25vb3BYYmFzZUFkZHJlc3MsIDB4MDAwMGZmZmYpOworCQlHVF9SRUdfV1JJVEUgKHNub29wWHRvcEFkZHJlc3MsIDApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJYmFzZUFkZHJlc3MgPSBiYXNlQWRkcmVzcyAmIDB4ZmZmMDAwMDA7CS8qIEdyYW51bGFyaXR5IG9mIDFNQnl0ZSAqLworCWRhdGEgPSAoYmFzZUFkZHJlc3MgPj4gMjApIHwgc25vb3BUeXBlIDw8IDEyOworCUdUX1JFR19XUklURSAoc25vb3BYYmFzZUFkZHJlc3MsIGRhdGEpOworCXNub29wSGlnaCA9IChzbm9vcEhpZ2ggJiAweGZmZjAwMDAwKSA+PiAyMDsKKwlHVF9SRUdfV1JJVEUgKHNub29wWHRvcEFkZHJlc3MsIHNub29wSGlnaCAtIDEpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGd0X3JlYWRfY29uZmlnX2R3b3JkIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHUzMiAqIHZhbHVlKQoreworCWludCBidXMgPSBQQ0lfQlVTIChkZXYpOworCisJaWYgKChidXMgPT0gbG9jYWxfYnVzZXNbMF0pIHx8IChidXMgPT0gbG9jYWxfYnVzZXNbMV0pKSB7CisJCSp2YWx1ZSA9IHBjaVJlYWRDb25maWdSZWcgKChQQ0lfSE9TVCkgaG9zZS0+Y2ZnX2FkZHIsIG9mZnNldCwKKwkJCQkJICAgUENJX0RFViAoZGV2KSk7CisJfSBlbHNlIHsKKwkJKnZhbHVlID0gcGNpT3ZlckJyaWRnZVJlYWRDb25maWdSZWcgKChQQ0lfSE9TVCkgaG9zZS0+CisJCQkJCQkgICAgIGNmZ19hZGRyLCBvZmZzZXQsCisJCQkJCQkgICAgIFBDSV9ERVYgKGRldiksIGJ1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Rfd3JpdGVfY29uZmlnX2R3b3JkIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICBwY2lfZGV2X3QgZGV2LCBpbnQgb2Zmc2V0LCB1MzIgdmFsdWUpCit7CisJaW50IGJ1cyA9IFBDSV9CVVMgKGRldik7CisKKwlpZiAoKGJ1cyA9PSBsb2NhbF9idXNlc1swXSkgfHwgKGJ1cyA9PSBsb2NhbF9idXNlc1sxXSkpIHsKKwkJcGNpV3JpdGVDb25maWdSZWcgKChQQ0lfSE9TVCkgaG9zZS0+Y2ZnX2FkZHIsIG9mZnNldCwKKwkJCQkgICBQQ0lfREVWIChkZXYpLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJcGNpT3ZlckJyaWRnZVdyaXRlQ29uZmlnUmVnICgoUENJX0hPU1QpIGhvc2UtPmNmZ19hZGRyLAorCQkJCQkgICAgIG9mZnNldCwgUENJX0RFViAoZGV2KSwgYnVzLAorCQkJCQkgICAgIHZhbHVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZ3Rfc2V0dXBfaWRlIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkgIHBjaV9kZXZfdCBkZXYsIHN0cnVjdCBwY2lfY29uZmlnX3RhYmxlICplbnRyeSkKK3sKKwlzdGF0aWMgY29uc3QgaW50IGlkZV9iYXJbXSA9IHsgOCwgNCwgOCwgNCwgMCwgMCB9OworCXUzMiBiYXJfcmVzcG9uc2UsIGJhcl92YWx1ZTsKKwlpbnQgYmFyOworCisJZm9yIChiYXIgPSAwOyBiYXIgPCA2OyBiYXIrKykgeworCQkvKnJvbmVuIGRpZmZlcmVudCBmdW5jdGlvbiBmb3IgM3JkIGJhbmsuICovCisJCXVuc2lnbmVkIGludCBvZmZzZXQgPQorCQkJKGJhciA8IDIpID8gYmFyICogOCA6IDB4MTAwICsgKGJhciAtIDIpICogODsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIG9mZnNldCwKKwkJCQkJMHgwKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIG9mZnNldCwKKwkJCQkgICAgICAgJmJhcl9yZXNwb25zZSk7CisKKwkJcGNpYXV0b19yZWdpb25fYWxsb2NhdGUgKGJhcl9yZXNwb25zZSAmCisJCQkJCSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPID8gaG9zZS0+CisJCQkJCSBwY2lfaW8gOiBob3NlLT5wY2lfbWVtLCBpZGVfYmFyW2Jhcl0sCisJCQkJCSAmYmFyX3ZhbHVlKTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkIChkZXYsIFBDSV9CQVNFX0FERFJFU1NfMCArIGJhciAqIDQsCisJCQkJCWJhcl92YWx1ZSk7CisJfQorfQorCisKKy8qIFRPRE8gQkpXOiBDaGFuZ2UgdGhpcyBmb3IgREI2NDM2MC4gVGhpcyB3YXMgcHVsbGVkIGZyb20gdGhlIEVWNjQyNjAgICovCisvKiBhbmQgaXMgY3VyZW50bHkgbm90IGNhbGxlZCAqLiAqLworI2lmIDAKK3N0YXRpYyB2b2lkIGd0X2ZpeHVwX2lycSAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworCXVuc2lnbmVkIGNoYXIgcGluLCBpcnE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisKKwlpZiAocGluID09IDEpIHsJCS8qIG9ubHkgYWxsb3cgSU5UIEEgKi8KKwkJaXJxID0gcGNpX2lycV9zd2l6emxlWyhQQ0lfSE9TVCkgaG9zZS0+CisJCQkJICAgICAgY2ZnX2FkZHJdW1BDSV9ERVYgKGRldildOworCQlpZiAoaXJxKQorCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKKwl9Cit9CisjZW5kaWYKKworc3RydWN0IHBjaV9jb25maWdfdGFibGUgZ3RfY29uZmlnX3RhYmxlW10gPSB7CisJe1BDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19TVE9SQUdFX0lERSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZ3Rfc2V0dXBfaWRlfSwKKworCXt9Cit9OworCitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgcGNpMF9ob3NlID0geworLyogICAgZml4dXBfaXJxOiBndF9maXh1cF9pcnEsICovCisJY29uZmlnX3RhYmxlOmd0X2NvbmZpZ190YWJsZSwKK307CisKK3N0cnVjdCBwY2lfY29udHJvbGxlciBwY2kxX2hvc2UgPSB7CisvKiAgICBmaXh1cF9pcnE6IGd0X2ZpeHVwX2lycSwgKi8KKwljb25maWdfdGFibGU6Z3RfY29uZmlnX3RhYmxlLAorfTsKKwordm9pZCBwY2lfaW5pdF9ib2FyZCAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY29tbWFuZDsKKworI2lmZGVmIERFQlVHCisJZ3RfcGNpX2J1c19tb2RlX2Rpc3BsYXkgKFBDSV9IT1NUMCk7CisjZW5kaWYKKworCXBjaTBfaG9zZS5maXJzdF9idXNubyA9IDA7CisJcGNpMF9ob3NlLmxhc3RfYnVzbm8gPSAweGZmOworCWxvY2FsX2J1c2VzWzBdID0gcGNpMF9ob3NlLmZpcnN0X2J1c25vOworCisJLyogUENJIG1lbW9yeSBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uIChwY2kwX2hvc2UucmVnaW9ucyArIDAsCisJCQlDRkdfUENJMF8wX01FTV9TUEFDRSwKKwkJCUNGR19QQ0kwXzBfTUVNX1NQQUNFLAorCQkJQ0ZHX1BDSTBfTUVNX1NJWkUsIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbiAocGNpMF9ob3NlLnJlZ2lvbnMgKyAxLAorCQkJQ0ZHX1BDSTBfSU9fU1BBQ0VfUENJLAorCQkJQ0ZHX1BDSTBfSU9fU1BBQ0UsIENGR19QQ0kwX0lPX1NJWkUsIFBDSV9SRUdJT05fSU8pOworCisJcGNpX3NldF9vcHMgKCZwY2kwX2hvc2UsCisJCSAgICAgcGNpX2hvc2VfcmVhZF9jb25maWdfYnl0ZV92aWFfZHdvcmQsCisJCSAgICAgcGNpX2hvc2VfcmVhZF9jb25maWdfd29yZF92aWFfZHdvcmQsCisJCSAgICAgZ3RfcmVhZF9jb25maWdfZHdvcmQsCisJCSAgICAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGVfdmlhX2R3b3JkLAorCQkgICAgIHBjaV9ob3NlX3dyaXRlX2NvbmZpZ193b3JkX3ZpYV9kd29yZCwKKwkJICAgICBndF93cml0ZV9jb25maWdfZHdvcmQpOworCXBjaTBfaG9zZS5yZWdpb25fY291bnQgPSAyOworCisJcGNpMF9ob3NlLmNmZ19hZGRyID0gKHVuc2lnbmVkIGludCAqKSBQQ0lfSE9TVDA7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZSAoJnBjaTBfaG9zZSk7CisJcGNpQXJiaXRlckVuYWJsZSAoUENJX0hPU1QwKTsKKwlwY2lQYXJraW5nRGlzYWJsZSAoUENJX0hPU1QwLCAxLCAxLCAxLCAxLCAxLCAxLCAxKTsKKwljb21tYW5kID0gcGNpUmVhZENvbmZpZ1JlZyAoUENJX0hPU1QwLCBQQ0lfQ09NTUFORCwgU0VMRik7CisJY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9NQVNURVI7CisJcGNpV3JpdGVDb25maWdSZWcgKFBDSV9IT1NUMCwgUENJX0NPTU1BTkQsIFNFTEYsIGNvbW1hbmQpOworCWNvbW1hbmQgPSBwY2lSZWFkQ29uZmlnUmVnIChQQ0lfSE9TVDAsIFBDSV9DT01NQU5ELCBTRUxGKTsKKwljb21tYW5kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwlwY2lXcml0ZUNvbmZpZ1JlZyAoUENJX0hPU1QwLCBQQ0lfQ09NTUFORCwgU0VMRiwgY29tbWFuZCk7CisKKwlwY2kwX2hvc2UubGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4gKCZwY2kwX2hvc2UpOworCisjaWZkZWYgREVCVUcKKwlndF9wY2lfYnVzX21vZGVfZGlzcGxheSAoUENJX0hPU1QxKTsKKyNlbmRpZgorCXBjaTFfaG9zZS5maXJzdF9idXNubyA9IHBjaTBfaG9zZS5sYXN0X2J1c25vICsgMTsKKwlwY2kxX2hvc2UubGFzdF9idXNubyA9IDB4ZmY7CisJcGNpMV9ob3NlLmN1cnJlbnRfYnVzbm8gPSBwY2kxX2hvc2UuZmlyc3RfYnVzbm87CisJbG9jYWxfYnVzZXNbMV0gPSBwY2kxX2hvc2UuZmlyc3RfYnVzbm87CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24gKHBjaTFfaG9zZS5yZWdpb25zICsgMCwKKwkJCUNGR19QQ0kxXzBfTUVNX1NQQUNFLAorCQkJQ0ZHX1BDSTFfMF9NRU1fU1BBQ0UsCisJCQlDRkdfUENJMV9NRU1fU0laRSwgUENJX1JFR0lPTl9NRU0pOworCisJLyogUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uIChwY2kxX2hvc2UucmVnaW9ucyArIDEsCisJCQlDRkdfUENJMV9JT19TUEFDRV9QQ0ksCisJCQlDRkdfUENJMV9JT19TUEFDRSwgQ0ZHX1BDSTFfSU9fU0laRSwgUENJX1JFR0lPTl9JTyk7CisKKwlwY2lfc2V0X29wcyAoJnBjaTFfaG9zZSwKKwkJICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkJICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkX3ZpYV9kd29yZCwKKwkJICAgICBndF9yZWFkX2NvbmZpZ19kd29yZCwKKwkJICAgICBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZV92aWFfZHdvcmQsCisJCSAgICAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQkgICAgIGd0X3dyaXRlX2NvbmZpZ19kd29yZCk7CisKKwlwY2kxX2hvc2UucmVnaW9uX2NvdW50ID0gMjsKKworCXBjaTFfaG9zZS5jZmdfYWRkciA9ICh1bnNpZ25lZCBpbnQgKikgUENJX0hPU1QxOworCisJcGNpX3JlZ2lzdGVyX2hvc2UgKCZwY2kxX2hvc2UpOworCisJcGNpQXJiaXRlckVuYWJsZSAoUENJX0hPU1QxKTsKKwlwY2lQYXJraW5nRGlzYWJsZSAoUENJX0hPU1QxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKTsKKworCWNvbW1hbmQgPSBwY2lSZWFkQ29uZmlnUmVnIChQQ0lfSE9TVDEsIFBDSV9DT01NQU5ELCBTRUxGKTsKKwljb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lXcml0ZUNvbmZpZ1JlZyAoUENJX0hPU1QxLCBQQ0lfQ09NTUFORCwgU0VMRiwgY29tbWFuZCk7CisKKwlwY2kxX2hvc2UubGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4gKCZwY2kxX2hvc2UpOworCisJY29tbWFuZCA9IHBjaVJlYWRDb25maWdSZWcgKFBDSV9IT1NUMSwgUENJX0NPTU1BTkQsIFNFTEYpOworCWNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCXBjaVdyaXRlQ29uZmlnUmVnIChQQ0lfSE9TVDEsIFBDSV9DT01NQU5ELCBTRUxGLCBjb21tYW5kKTsKKworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL3NkcmFtX2luaXQuYyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9zZHJhbV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2MzVmOAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDM2MC9zZHJhbV9pbml0LmMKQEAgLTAsMCArMSwxOTg0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYWRhcHRpb24gZm9yIHRoZSBNYXJ2ZWxsIERCNjQzNjAgQm9hcmQKKyAqIEluZ28gQXNzbXVzIChpbmdvLmFzc211c0BrZXltaWxlLmNvbSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogc2RyYW1faW5pdC5jIC0gYXV0b21hdGljIG1lbW9yeSBzaXppbmcgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPDc0eHhfN3h4Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tZW1vcnkuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL3BjaS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorI2luY2x1ZGUgPG5ldC5oPgorCisjaW5jbHVkZSAiZXRoLmgiCisjaW5jbHVkZSAibXBzYy5oIgorI2luY2x1ZGUgIi4uL2NvbW1vbi9pMmMuaCIKKyNpbmNsdWRlICI2NDM2MC5oIgorI2luY2x1ZGUgIm12X3JlZ3MuaCIKKworI3VuZGVmCURFQlVHCisjZGVmaW5lIE1BUF9QQ0kKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQKHgpIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworaW50IHNldF9kZmNkbEluaXQgKHZvaWQpOwkvKiBzZXR1cCBkZWxheSBsaW5lIG9mIE12NjQzNjAgKi8KK2ludCBtdkRtYUlzQ2hhbm5lbEFjdGl2ZSAoaW50KTsKK2ludCBtdkRtYVNldE1lbW9yeVNwYWNlICh1bG9uZywgdWxvbmcsIHVsb25nLCB1bG9uZywgdWxvbmcpOworaW50IG12RG1hVHJhbnNmZXIgKGludCwgdWxvbmcsIHVsb25nLCB1bG9uZywgdWxvbmcpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludAorbWVtb3J5X21hcF9iYW5rICh1bnNpZ25lZCBpbnQgYmFua05vLAorCQkgdW5zaWduZWQgaW50IGJhbmtCYXNlLCB1bnNpZ25lZCBpbnQgYmFua0xlbmd0aCkKK3sKKyNpZmRlZiBNQVBfUENJCisJUENJX0hPU1QgaG9zdDsKKyNlbmRpZgorCisKKyNpZmRlZiBERUJVRworCWlmIChiYW5rTGVuZ3RoID4gMCkgeworCQlwcmludGYgKCJtYXBwaW5nIGJhbmsgJWQgYXQgJTA4eCAtICUwOHhcbiIsCisJCQliYW5rTm8sIGJhbmtCYXNlLCBiYW5rQmFzZSArIGJhbmtMZW5ndGggLSAxKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJ1bm1hcHBpbmcgYmFuayAlZFxuIiwgYmFua05vKTsKKwl9CisjZW5kaWYKKworCW1lbW9yeU1hcEJhbmsgKGJhbmtObywgYmFua0Jhc2UsIGJhbmtMZW5ndGgpOworCisjaWZkZWYgTUFQX1BDSQorCWZvciAoaG9zdCA9IFBDSV9IT1NUMDsgaG9zdCA8PSBQQ0lfSE9TVDE7IGhvc3QrKykgeworCQljb25zdCBpbnQgZmVhdHVyZXMgPQorCQkJUFJFRkVUQ0hfRU5BQkxFIHwKKwkJCURFTEFZRURfUkVBRF9FTkFCTEUgfAorCQkJQUdHUkVTU0lWRV9QUkVGRVRDSCB8CisJCQlSRUFEX0xJTkVfQUdHUkVTU0lWRV9QUkVGRVRDSCB8CisJCQlSRUFEX01VTFRJX0FHR1JFU1NJVkVfUFJFRkVUQ0ggfAorCQkJTUFYX0JVUlNUXzQgfCBQQ0lfTk9fU1dBUDsKKworCQlwY2lNYXBNZW1vcnlCYW5rIChob3N0LCBiYW5rTm8sIGJhbmtCYXNlLCBiYW5rTGVuZ3RoKTsKKworCQlwY2lTZXRSZWdpb25Tbm9vcE1vZGUgKGhvc3QsIGJhbmtObywgUENJX1NOT09QX1dCLCBiYW5rQmFzZSwKKwkJCQkgICAgICAgYmFua0xlbmd0aCk7CisKKwkJcGNpU2V0UmVnaW9uRmVhdHVyZXMgKGhvc3QsIGJhbmtObywgZmVhdHVyZXMsIGJhbmtCYXNlLAorCQkJCSAgICAgIGJhbmtMZW5ndGgpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjZGVmaW5lIEdCCSAgICgxIDw8IDMwKQorCisvKiBtdWNoIG9mIHRoaXMgY29kZSBpcyBiYXNlZCBvbiAob3IgaXMpIHRoZSBjb2RlIGluIHRoZSBwaXA0MDUgcG9ydCAqLworLyogdGhhbmtzIGdvIHRvIHRoZSBhdXRob3JzIG9mIHNhaWQgcG9ydCAtIEpvc2ggKi8KKworLyogc3RydWN0dXJlIHRvIHN0b3JlIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCBhbiBzZHJhbSBiYW5rICovCit0eXBlZGVmIHN0cnVjdCBzZHJhbV9pbmZvIHsKKwl1Y2hhciBkcmJfc2l6ZTsKKwl1Y2hhciByZWdpc3RlcmVkLCBlY2M7CisJdWNoYXIgdHBhcjsKKwl1Y2hhciB0cmFzX2Nsb2NrczsKKwl1Y2hhciBidXJzdF9sZW47CisJdWNoYXIgYmFua3MsIHNsb3Q7Cit9IHNkcmFtX2luZm9fdDsKKworLyogVHlwZWRlZnMgZm9yICdndEF1eGlsR2V0RElNTWluZm8nIGZ1bmN0aW9uICovCisKK3R5cGVkZWYgZW51bSBfbWVtb3J5VHlwZSB7IFNEUkFNLCBERFIgfSBNRU1PUllfVFlQRTsKKwordHlwZWRlZiBlbnVtIF92b2x0YWdlSW50ZXJmYWNlIHsgVFRMXzVWX1RPTEVSQU5ULCBMVlRUTCwgSFNUTF8xXzVWLAorCVNTVExfM18zViwgU1NUTF8yXzVWLCBWT0xUQUdFX1VOS05PV04sCit9IFZPTFRBR0VfSU5URVJGQUNFOworCit0eXBlZGVmIGVudW0gX21heF9DTF9zdXBwb3J0ZWRfRERSIHsgRERSX0NMXzEgPSAxLCBERFJfQ0xfMV81ID0gMiwgRERSX0NMXzIgPQorCQk0LCBERFJfQ0xfMl81ID0gOCwgRERSX0NMXzMgPSAxNiwgRERSX0NMXzNfNSA9CisJCTMyLCBERFJfQ0xfRkFVTFQgfSBNQVhfQ0xfU1VQUE9SVEVEX0REUjsKK3R5cGVkZWYgZW51bSBfbWF4X0NMX3N1cHBvcnRlZF9TRCB7IFNEX0NMXzEgPQorCQkxLCBTRF9DTF8yLCBTRF9DTF8zLCBTRF9DTF80LCBTRF9DTF81LCBTRF9DTF82LCBTRF9DTF83LAorCQlTRF9GQVVMVCB9IE1BWF9DTF9TVVBQT1JURURfU0Q7CisKKworLyogU0RSQU0vRERSIGluZm9ybWF0aW9uIHN0cnVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgX2d0TWVtb3J5RGltbUluZm8geworCU1FTU9SWV9UWVBFIG1lbW9yeVR5cGU7CisJdW5zaWduZWQgaW50IG51bU9mUm93QWRkcmVzc2VzOworCXVuc2lnbmVkIGludCBudW1PZkNvbEFkZHJlc3NlczsKKwl1bnNpZ25lZCBpbnQgbnVtT2ZNb2R1bGVCYW5rczsKKwl1bnNpZ25lZCBpbnQgZGF0YVdpZHRoOworCVZPTFRBR0VfSU5URVJGQUNFIHZvbHRhZ2VJbnRlcmZhY2U7CisJdW5zaWduZWQgaW50IGVycm9yQ2hlY2tUeXBlOwkvKiBFQ0MgLCBQQVJJVFkuLiAqLworCXVuc2lnbmVkIGludCBzZHJhbVdpZHRoOyAvKiA0LDgsMTYgb3IgMzIgKi8gOworCXVuc2lnbmVkIGludCBlcnJvckNoZWNrRGF0YVdpZHRoOwkvKiAwIC0gbm8sIDEgLSBZZXMgKi8KKwl1bnNpZ25lZCBpbnQgbWluQ2xrRGVsYXk7CisJdW5zaWduZWQgaW50IGJ1cnN0TGVuZ3RoU3VwcG9ydGVkOworCXVuc2lnbmVkIGludCBudW1PZkJhbmtzT25FYWNoRGV2aWNlOworCXVuc2lnbmVkIGludCBzdXBvcnRlZENhc0xhdGVuY2llczsKKwl1bnNpZ25lZCBpbnQgUmVmcmVzaEludGVydmFsOworCXVuc2lnbmVkIGludCBtYXhDQVNsYXRlbmN5U3VwcG9ydGVkX0xvUDsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBtYXhDQVNsYXRlbmN5U3VwcG9ydGVkX1JvUDsJLyogUm9QIHJpZ2h0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwlNQVhfQ0xfU1VQUE9SVEVEX0REUiBtYXhDbFN1cHBvcnRlZF9ERFI7CisJTUFYX0NMX1NVUFBPUlRFRF9TRCBtYXhDbFN1cHBvcnRlZF9TRDsKKwl1bnNpZ25lZCBpbnQgbW9kdWxlQmFua0RlbnNpdHk7CisJLyogbW9kdWxlIGF0dHJpYnV0ZXMgKHRydWUgZm9yIHllcykgKi8KKwlib29sIGJ1ZmZlcmVkQWRkckFuZENvbnRyb2xJbnB1dHM7CisJYm9vbCByZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHM7CisJYm9vbCBvbkNhcmRQTEw7CisJYm9vbCBidWZmZXJlZERRTUJpbnB1dHM7CisJYm9vbCByZWdpc3RlcmVkRFFNQmlucHV0czsKKwlib29sIGRpZmZlcmVudGlhbENsb2NrSW5wdXQ7CisJYm9vbCByZWR1bmRhbnRSb3dBZGRyZXNzaW5nOworCisJLyogbW9kdWxlIGdlbmVyYWwgYXR0cmlidXRlcyAqLworCWJvb2wgc3Vwb3J0ZWRBdXRvUHJlQ2hhcmdlOworCWJvb2wgc3Vwb3J0ZWRQcmVDaGFyZ2VBbGw7CisJYm9vbCBzdXBvcnRlZEVhcmx5UmFzUHJlQ2hhcmdlOworCWJvb2wgc3Vwb3J0ZWRXcml0ZTFSZWFkQnVyc3Q7CisJYm9vbCBzdXBvcnRlZDVQZXJjZW50TG93VkNDOworCWJvb2wgc3Vwb3J0ZWQ1UGVyY2VudFVwcGVyVkNDOworCS8qIG1vZHVsZSB0aW1pbmcgcGFyYW1ldGVycyAqLworCXVuc2lnbmVkIGludCBtaW5SYXNUb0Nhc0RlbGF5OworCXVuc2lnbmVkIGludCBtaW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheTsKKwl1bnNpZ25lZCBpbnQgbWluUmFzUHVsc2VXaWR0aDsKKwl1bnNpZ25lZCBpbnQgbWluUm93UHJlY2hhcmdlVGltZTsJLyogbWVhc3VyZWQgaW4gbnMgKi8KKworCWludCBhZGRyQW5kQ29tbWFuZEhvbGRUaW1lOwkvKiBMb1AgbGVmdCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJaW50IGFkZHJBbmRDb21tYW5kU2V0dXBUaW1lOwkvKiAobWVhc3VyZWQgaW4gbnMvMTAwKSAqLworCWludCBkYXRhSW5wdXRTZXR1cFRpbWU7IC8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwlpbnQgZGF0YUlucHV0SG9sZFRpbWU7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKy8qIHRBQyB0aW1lcyBmb3IgaGlnaGVzdCAybmQgYW5kIDNyZCBoaWdoZXN0IENBUyBMYXRlbmN5IHZhbHVlcyAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dF9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tUb0RhdGFPdXRfUm9QOwkvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dE1pbnVzMV9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tUb0RhdGFPdXRNaW51czFfUm9QOwkvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dE1pbnVzMl9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgY2xvY2tUb0RhdGFPdXRNaW51czJfUm9QOwkvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfTG9QOwkvKiBMb1AgbGVmdCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfUm9QOwkvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czFfTG9QOyAvKiBMb1AgbGVmdCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czFfUm9QOyAvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czJfTG9QOyAvKiBMb1AgbGVmdCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czJfUm9QOyAvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCisJLyogUGFyYW1ldGVycyBjYWxjdWxhdGVkIGZyb20KKwkgICB0aGUgZXh0cmFjdGVkIERJTU0gaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZGV2aWNlRGVuc2l0eTsJLyogMTYsNjQsMTI4LDI1NiBvciA1MTIgTWJpdCAqLworCXVuc2lnbmVkIGludCBudW1iZXJPZkRldmljZXM7CisJdWNoYXIgZHJiX3NpemU7CQkvKiBEUkFNIHNpemUgaW4gbio2NE1iaXQgKi8KKwl1Y2hhciBzbG90OwkJLyogU2xvdCBOdW1iZXIgdGhpcyBtb2R1bGUgaXMgaW5zZXJ0ZWQgaW4gKi8KKwl1Y2hhciBzcGRfcmF3X2RhdGFbMTI4XTsJLyogQ29udGVudCBvZiBTUEQtRUVQUk9NIGNvcGllZCAxOjEgKi8KKyNpZmRlZiBERUJVRworCXVjaGFyIG1hbnVmYWN0dXJhWzhdOwkvKiBDb250ZW50IG9mIFNQRC1FRVBST00gQnl0ZSA2NC03MSAqLworCXVjaGFyIG1vZHVsX2lkWzE4XTsJLyogQ29udGVudCBvZiBTUEQtRUVQUk9NIEJ5dGUgNzMtOTAgKi8KKwl1Y2hhciB2ZW5kb3JfZGF0YVsyN107CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDk5LTEyNSAqLworCXVuc2lnbmVkIGxvbmcgbW9kdWxfc2VyaWFsX25vOwkvKiBDb250ZW50IG9mIFNQRC1FRVBST00gQnl0ZSA5NS05OCAqLworCXVuc2lnbmVkIGludCBtYW51ZmFjX2RhdGU7CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDkzLTk0ICovCisJdW5zaWduZWQgaW50IG1vZHVsX3JldmlzaW9uOwkvKiBDb250ZW50IG9mIFNQRC1FRVBST00gQnl0ZSA5MS05MiAqLworCXVjaGFyIG1hbnVmYWNfcGxhY2U7CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDcyICovCisKKyNlbmRpZgorfSBBVVhfTUVNX0RJTU1fSU5GTzsKKworCisvKgorICogdHJhbnNsYXRlIG5zLm5zLzEwIGNvZGluZyBvZiBTUEQgdGltaW5nIHZhbHVlcworICogaW50byAxMCBwcyB1bml0IHZhbHVlcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IE5TMTB0bzEwUFMgKHVuc2lnbmVkIGNoYXIgc3BkX2J5dGUpCit7CisJdW5zaWduZWQgc2hvcnQgbnMsIG5zMTA7CisKKwkvKiBpc29sYXRlIHVwcGVyIG5pYmJsZSAqLworCW5zID0gKHNwZF9ieXRlID4+IDQpICYgMHgwRjsKKwkvKiBpc29sYXRlIGxvd2VyIG5pYmJsZSAqLworCW5zMTAgPSAoc3BkX2J5dGUgJiAweDBGKTsKKworCXJldHVybiAobnMgKiAxMDAgKyBuczEwICogMTApOworfQorCisvKgorICogdHJhbnNsYXRlIG5zIGNvZGluZyBvZiBTUEQgdGltaW5nIHZhbHVlcworICogaW50byAxMCBwcyB1bml0IHZhbHVlcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IE5TdG8xMFBTICh1bnNpZ25lZCBjaGFyIHNwZF9ieXRlKQoreworCXJldHVybiAoc3BkX2J5dGUgKiAxMDApOworfQorCisvKiBUaGlzIGNvZGUgcmVhZHMgdGhlIFNQRCBjaGlwIG9uIHRoZSBzZHJhbSBhbmQgcG9wdWxhdGVzCisgKiB0aGUgYXJyYXkgd2hpY2ggaXMgcGFzc2VkIGluIHdpdGggdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uICovCisvKiBzdGF0aWMgaW50IGNoZWNrX2RpbW0odWNoYXIgc2xvdCwgQVVYX01FTV9ESU1NX0lORk8gKmluZm8pICovCitzdGF0aWMgaW50IGNoZWNrX2RpbW0gKHVjaGFyIHNsb3QsIEFVWF9NRU1fRElNTV9JTkZPICogZGltbUluZm8pCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwl1bnNpZ25lZCBsb25nIHNwZF9jaGVja3N1bTsKKworI2lmZGVmIFpVTUFfTlRMCisJLyogemVybyBhbGwgdGhlIHZhbHVlcyAqLworCW1lbXNldCAoaW5mbywgMCwgc2l6ZW9mICgqaW5mbykpOworCisvKgorCWlmICghc2xvdCkgeworCSAgICBpbmZvLT5zbG90ID0gMDsKKwkgICAgaW5mby0+YmFua3MgPSAxOworCSAgICBpbmZvLT5yZWdpc3RlcmVkID0gMDsKKwkJICAgIGluZm8tPmRyYl9zaXplID0gMTY7Ki8gLyogMTYgLSAyNTZNQml0LCAzMiAtIDUxMk1CaXQgKi8KKy8qCSAgICBpbmZvLT50cGFyID0gMzsKKwkgICAgaW5mby0+dHJhc19jbG9ja3MgPSA1OworCSAgICBpbmZvLT5idXJzdF9sZW4gPSA0OworKi8KKyNpZmRlZiBDT05GSUdfTVY2NDM2MF9FQ0MKKwkvKiBjaGVjayBmb3IgRUNDL3Bhcml0eSBbMCA9IG5vbmUsIDEgPSBwYXJpdHksIDIgPSBlY2NdICovCisJZGltbUluZm8tPmVycm9yQ2hlY2tUeXBlID0gMjsKKy8qCSAgICBpbmZvLT5lY2MgPSAyOyovCisjZW5kaWYKK30KKworcmV0dXJuIDA7CisKKyNlbHNlCisJdWNoYXIgYWRkciA9IHNsb3QgPT0gMCA/IERJTU0wX0kyQ19BRERSIDogRElNTTFfSTJDX0FERFI7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgZGVuc2l0eSA9IDEsIGRldmljZXNGb3JFcnJDaGVjayA9IDA7CisKKyNpZmRlZiBERUJVRworCXVuc2lnbmVkIGludCBrOworI2VuZGlmCisJdW5zaWduZWQgaW50IHJpZ2h0T2ZQb2ludCA9IDAsIGxlZnRPZlBvaW50ID0gMCwgbXVsdCwgZGl2LCB0aW1lX3RtcDsKKwlpbnQgc2lnbiA9IDEsIHNoaWZ0LCBtYXNrTGVmdE9mUG9pbnQsIG1hc2tSaWdodE9mUG9pbnQ7CisJdWNoYXIgc3VwcF9jYWwsIGNhbF92YWw7CisJdWxvbmcgbWVtY2xrLCB0bWVtY2xrOworCXVsb25nIHRtcDsKKwl1Y2hhciB0cnBfY2xvY2tzID0gMCwgdHJjZF9jbG9ja3MsIHRyYXNfY2xvY2tzLCB0cnJkX2Nsb2NrczsKKwl1Y2hhciBkYXRhWzEyOF07CisKKwltZW1jbGsgPSBnZC0+YnVzX2NsazsKKwl0bWVtY2xrID0gMTAwMDAwMDAwMCAvIChtZW1jbGsgLyAxMDApOwkvKiBpbiAxMCBwcyB1bml0cyAqLworCisJRFAgKHB1dHMgKCJiZWZvcmUgaTJjIHJlYWRcbiIpKTsKKworCXJldCA9IGkyY19yZWFkIChhZGRyLCAwLCAxLCBkYXRhLCAxMjgpOworCisJRFAgKHB1dHMgKCJhZnRlciBpMmMgcmVhZFxuIikpOworCisJLyogemVybyBhbGwgdGhlIHZhbHVlcyAqLworCW1lbXNldCAoZGltbUluZm8sIDAsIHNpemVvZiAoKmRpbW1JbmZvKSk7CisKKwkvKiBjb3B5IHRoZSBTUEQgY29udGVudCAxOjEgaW50byB0aGUgZGltbUluZm8gc3RydWN0dXJlICovCisJZm9yIChpID0gMDsgaSA8PSAxMjc7IGkrKykgeworCQlkaW1tSW5mby0+c3BkX3Jhd19kYXRhW2ldID0gZGF0YVtpXTsKKwl9CisKKwlpZiAocmV0KSB7CisJCURQIChwcmludGYgKCJObyBESU1NIGluIHNsb3QgJWQgW2VyciA9ICV4XVxuIiwgc2xvdCwgcmV0KSk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlkaW1tSW5mby0+c2xvdCA9IHNsb3Q7CS8qIHN0YXJ0IHRvIGZpbGwgdXAgZGltbWluZm8gZm9yIHRoaXMgInNsb3QiICovCisKKyNpZmRlZiBDRkdfRElTUExBWV9ESU1NX1NQRF9DT05URU5UCisKKwlmb3IgKGkgPSAwOyBpIDw9IDEyNzsgaSsrKSB7CisJCXByaW50ZiAoIlNQRC1FRVBST00gQnl0ZSAlM2QgPSAlM3ggKCUzZClcbiIsIGksIGRhdGFbaV0sCisJCQlkYXRhW2ldKTsKKwl9CisKKyNlbmRpZgorI2lmZGVmIERFQlVHCisvKiBmaW5kIE1hbnVmYWN0dXJhIG9mIERpbW0gTW9kdWxlICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGltbUluZm8tPm1hbnVmYWN0dXJhKTsgaSsrKSB7CisJCWRpbW1JbmZvLT5tYW51ZmFjdHVyYVtpXSA9IGRhdGFbNjQgKyBpXTsKKwl9CisJcHJpbnRmICgiXG5UaGlzIFJBTS1Nb2R1bGUgaXMgcHJvZHVjZWQgYnk6CQklc1xuIiwKKwkJZGltbUluZm8tPm1hbnVmYWN0dXJhKTsKKworLyogZmluZCBNYW51bC1JRCBvZiBEaW1tIE1vZHVsZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRpbW1JbmZvLT5tb2R1bF9pZCk7IGkrKykgeworCQlkaW1tSW5mby0+bW9kdWxfaWRbaV0gPSBkYXRhWzczICsgaV07CisJfQorCXByaW50ZiAoIlRoZSBNb2R1bGUtSUQgb2YgdGhpcyBSQU0tTW9kdWxlIGlzOgkJJXNcbiIsCisJCWRpbW1JbmZvLT5tb2R1bF9pZCk7CisKKy8qIGZpbmQgVmVuZG9yLURhdGEgb2YgRGltbSBNb2R1bGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkaW1tSW5mby0+dmVuZG9yX2RhdGEpOyBpKyspIHsKKwkJZGltbUluZm8tPnZlbmRvcl9kYXRhW2ldID0gZGF0YVs5OSArIGldOworCX0KKwlwcmludGYgKCJWZW5kb3IgRGF0YSBvZiB0aGlzIFJBTS1Nb2R1bGUgaXM6CQklc1xuIiwKKwkJZGltbUluZm8tPnZlbmRvcl9kYXRhKTsKKworLyogZmluZCBtb2R1bF9zZXJpYWxfbm8gb2YgRGltbSBNb2R1bGUgKi8KKwlkaW1tSW5mby0+bW9kdWxfc2VyaWFsX25vID0gKCooKHVuc2lnbmVkIGxvbmcgKikgKCZkYXRhWzk1XSkpKTsKKwlwcmludGYgKCJTZXJpYWwgTm8uIG9mIHRoaXMgUkFNLU1vZHVsZSBpczoJCSVsZCAoJWx4KVxuIiwKKwkJZGltbUluZm8tPm1vZHVsX3NlcmlhbF9ubywgZGltbUluZm8tPm1vZHVsX3NlcmlhbF9ubyk7CisKKy8qIGZpbmQgTWFudWZhYy1EYXRhIG9mIERpbW0gTW9kdWxlICovCisJZGltbUluZm8tPm1hbnVmYWNfZGF0ZSA9ICgqKCh1bnNpZ25lZCBpbnQgKikgKCZkYXRhWzkzXSkpKTsKKwlwcmludGYgKCJNYW51ZmFjdG9yaW5nIERhdGUgb2YgdGhpcyBSQU0tTW9kdWxlIGlzOgklZC4lZFxuIiwgZGF0YVs5M10sIGRhdGFbOTRdKTsJLypkaW1tSW5mby0+bWFudWZhY19kYXRlICovCisKKy8qIGZpbmQgbW9kdWxfcmV2aXNpb24gb2YgRGltbSBNb2R1bGUgKi8KKwlkaW1tSW5mby0+bW9kdWxfcmV2aXNpb24gPSAoKigodW5zaWduZWQgaW50ICopICgmZGF0YVs5MV0pKSk7CisJcHJpbnRmICgiTW9kdWxlIFJldmlzaW9uIG9mIHRoaXMgUkFNLU1vZHVsZSBpczoJCQklZC4lZFxuIiwgZGF0YVs5MV0sIGRhdGFbOTJdKTsJLyogZGltbUluZm8tPm1vZHVsX3JldmlzaW9uICovCisKKy8qIGZpbmQgbWFudWZhY19wbGFjZSBvZiBEaW1tIE1vZHVsZSAqLworCWRpbW1JbmZvLT5tYW51ZmFjX3BsYWNlID0gKCooKHVuc2lnbmVkIGNoYXIgKikgKCZkYXRhWzcyXSkpKTsKKwlwcmludGYgKCJtYW51ZmFjX3BsYWNlIG9mIHRoaXMgUkFNLU1vZHVsZSBpczoJCSVkXG4iLAorCQlkaW1tSW5mby0+bWFudWZhY19wbGFjZSk7CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBjYWxjdWxhdGUgU1BEIGNoZWNrc3VtICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJc3BkX2NoZWNrc3VtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPD0gNjI7IGkrKykgeworCQlzcGRfY2hlY2tzdW0gKz0gZGF0YVtpXTsKKwl9CisKKwlpZiAoKHNwZF9jaGVja3N1bSAmIDB4ZmYpICE9IGRhdGFbNjNdKSB7CisJCXByaW50ZiAoIiMjIyBFcnJvciBpbiBTUEQgQ2hlY2tzdW0gISEhIElzX3ZhbHVlOiAlMnggc2hvdWxkIHZhbHVlICUyeFxuIiwgKHVuc2lnbmVkIGludCkgKHNwZF9jaGVja3N1bSAmIDB4ZmYpLCBkYXRhWzYzXSk7CisJCWhhbmcgKCk7CisJfQorCisJZWxzZQorCQlwcmludGYgKCJTUEQgQ2hlY2tzdW0gb2shXG4iKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJZm9yIChpID0gMjsgaSA8PSAzNTsgaSsrKSB7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIDI6IC8qIE1lbW9yeSB0eXBlIChERFIgLyBTRFJBTSkgKi8KKwkJCWRpbW1JbmZvLT5tZW1vcnlUeXBlID0gKGRhdGFbaV0gPT0gMHg3KSA/IEREUiA6IFNEUkFNOworI2lmZGVmIERFQlVHCisJCQlpZiAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gMCkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiRHJhbV90eXBlIGluIHNsb3QgJWQgaXM6CQkJU0RSQU1cbiIsCisJCQkJICAgICBkaW1tSW5mby0+c2xvdCkpOworCQkJaWYgKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIkRyYW1fdHlwZSBpbiBzbG90ICVkIGlzOgkJCUREUkFNXG4iLAorCQkJCSAgICAgZGltbUluZm8tPnNsb3QpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAzOiAvKiBOdW1iZXIgT2YgUm93IEFkZHJlc3NlcyAqLworCQkJZGltbUluZm8tPm51bU9mUm93QWRkcmVzc2VzID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1vZHVsZSBOdW1iZXIgb2Ygcm93IGFkZHJlc3NlczoJCSVkXG4iLAorCQkJICAgICBkaW1tSW5mby0+bnVtT2ZSb3dBZGRyZXNzZXMpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgNDogLyogTnVtYmVyIE9mIENvbHVtbiBBZGRyZXNzZXMgKi8KKwkJCWRpbW1JbmZvLT5udW1PZkNvbEFkZHJlc3NlcyA9IGRhdGFbaV07CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNb2R1bGUgTnVtYmVyIG9mIGNvbCBhZGRyZXNzZXM6CQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPm51bU9mQ29sQWRkcmVzc2VzKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDU6IC8qIE51bWJlciBPZiBNb2R1bGUgQmFua3MgKi8KKwkJCWRpbW1JbmZvLT5udW1PZk1vZHVsZUJhbmtzID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk51bWJlciBvZiBCYW5rcyBvbiBNb2QuIDoJCQkJCSVkXG4iLAorCQkJICAgICBkaW1tSW5mby0+bnVtT2ZNb2R1bGVCYW5rcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSA2OiAvKiBEYXRhIFdpZHRoICovCisJCQlkaW1tSW5mby0+ZGF0YVdpZHRoID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1vZHVsZSBEYXRhIFdpZHRoOgkJCQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPmRhdGFXaWR0aCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSA4OiAvKiBWb2x0YWdlIEludGVyZmFjZSAqLworCQkJc3dpdGNoIChkYXRhW2ldKSB7CisJCQljYXNlIDB4MDoKKwkJCQlkaW1tSW5mby0+dm9sdGFnZUludGVyZmFjZSA9IFRUTF81Vl9UT0xFUkFOVDsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTW9kdWxlIGlzCQkJCQkJVFRMXzVWX1RPTEVSQU5UXG4iKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MToKKwkJCQlkaW1tSW5mby0+dm9sdGFnZUludGVyZmFjZSA9IExWVFRMOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNb2R1bGUgaXMJCQkJCQlMVlRUTFxuIikpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDI6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBIU1RMXzFfNVY7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1vZHVsZSBpcwkJCQkJCVRUTF81Vl9UT0xFUkFOVFxuIikpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDM6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBTU1RMXzNfM1Y7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1vZHVsZSBpcwkJCQkJCUhTVExfMV81VlxuIikpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDQ6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBTU1RMXzJfNVY7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1vZHVsZSBpcwkJCQkJCVNTVExfMl81VlxuIikpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkaW1tSW5mby0+dm9sdGFnZUludGVyZmFjZSA9IFZPTFRBR0VfVU5LTk9XTjsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTW9kdWxlIGlzCQkJCQkJVk9MVEFHRV9VTktOT1dOXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDk6IC8qIE1pbmltdW0gQ3ljbGUgVGltZSBBdCBNYXggQ2FzTGF0YW5jeSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDQgOiAyOworCQkJbXVsdCA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMTAgOiAyNTsKKwkJCW1hc2tMZWZ0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweGYwIDogMHhmYzsKKwkJCW1hc2tSaWdodE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmIDogMHgwMzsKKwkJCWxlZnRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrTGVmdE9mUG9pbnQpID4+IHNoaWZ0OworCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrUmlnaHRPZlBvaW50KSAqIG11bHQ7CisJCQlkaW1tSW5mby0+bWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1AgPQorCQkJCWxlZnRPZlBvaW50OworCQkJZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfUm9QID0KKwkJCQlyaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNaW5pbXVtIEN5Y2xlIFRpbWUgQXQgTWF4IENhc0xhdGFuY3k6CQklZC4lZCBbbnNdXG4iLAorCQkJICAgICBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDEwOgkvKiBDbG9jayBUbyBEYXRhIE91dCAqLworCQkJZGl2ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAxMDAgOiAxMDsKKwkJCXRpbWVfdG1wID0KKwkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCSgoZGF0YVtpXSAmIDB4MGYpKTsKKwkJCWxlZnRPZlBvaW50ID0gdGltZV90bXAgLyBkaXY7CisJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIGRpdjsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dF9Mb1AgPSBsZWZ0T2ZQb2ludDsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dF9Sb1AgPSByaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmICgiQ2xvY2sgVG8gRGF0YSBPdXQ6CQkJCQklZC4lMmQgW25zXVxuIiwgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOwkvKmRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dCAqLworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qI2lmZGVmIENPTkZJR19FQ0MgKi8KKwkJY2FzZSAxMToJLyogRXJyb3IgQ2hlY2sgVHlwZSAqLworCQkJZGltbUluZm8tPmVycm9yQ2hlY2tUeXBlID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkVycm9yIENoZWNrIFR5cGUgKDA9Tk9ORSk6CQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5lcnJvckNoZWNrVHlwZSkpOworCQkJYnJlYWs7CisvKiAjZW5kaWYgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDEyOgkvKiBSZWZyZXNoIEludGVydmFsICovCisJCQlkaW1tSW5mby0+UmVmcmVzaEludGVydmFsID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIlJlZnJlc2hJbnRlcnZhbCAoODA9IFNlbGYgcmVmcmVzaCBOb3JtYWwsIDE1LjYyNXVzKSA6ICV4XG4iLAorCQkJICAgICBkaW1tSW5mby0+UmVmcmVzaEludGVydmFsKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDEzOgkvKiBTZHJhbSBXaWR0aCAqLworCQkJZGltbUluZm8tPnNkcmFtV2lkdGggPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiU2RyYW0gV2lkdGg6CQkJCQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPnNkcmFtV2lkdGgpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTQ6CS8qIEVycm9yIENoZWNrIERhdGEgV2lkdGggKi8KKwkJCWRpbW1JbmZvLT5lcnJvckNoZWNrRGF0YVdpZHRoID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkVycm9yIENoZWNrIERhdGEgV2lkdGg6CQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5lcnJvckNoZWNrRGF0YVdpZHRoKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDE1OgkvKiBNaW5pbXVtIENsb2NrIERlbGF5ICovCisJCQlkaW1tSW5mby0+bWluQ2xrRGVsYXkgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTWluaW11bSBDbG9jayBEZWxheToJCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5taW5DbGtEZWxheSkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAxNjoJLyogQnVyc3QgTGVuZ3RoIFN1cHBvcnRlZCAqLworCQkJICAgLyoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSAgICogYml0MyB8IGJpdDIgfCBiaXQxIHwgYml0MCAqCisJCQkgICAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqKgorCSAgICBidXJzdCBsZW5ndGggPSAqICA4CSAgfCAgNAkgfCAgIDIJfCAgIDEgICoKKwkJCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwkgICAgSWYgZm9yIGV4YW1wbGUgYml0MCBhbmQgYml0MiBhcmUgc2V0LCB0aGUgYnVyc3QKKwkgICAgbGVuZ3RoIHN1cHBvcnRlZCBhcmUgMSBhbmQgNC4gKi8KKworCQkJZGltbUluZm8tPmJ1cnN0TGVuZ3RoU3VwcG9ydGVkID0gZGF0YVtpXTsKKyNpZmRlZiBERUJVRworCQkJRFAgKHByaW50ZgorCQkJICAgICgiQnVyc3QgTGVuZ3RoIFN1cHBvcnRlZDoJCQkiKSk7CisJCQlpZiAoZGltbUluZm8tPmJ1cnN0TGVuZ3RoU3VwcG9ydGVkICYgMHgwMSkKKwkJCQlEUCAocHJpbnRmICgiMSwgIikpOworCQkJaWYgKGRpbW1JbmZvLT5idXJzdExlbmd0aFN1cHBvcnRlZCAmIDB4MDIpCisJCQkJRFAgKHByaW50ZiAoIjIsICIpKTsKKwkJCWlmIChkaW1tSW5mby0+YnVyc3RMZW5ndGhTdXBwb3J0ZWQgJiAweDA0KQorCQkJCURQIChwcmludGYgKCI0LCAiKSk7CisJCQlpZiAoZGltbUluZm8tPmJ1cnN0TGVuZ3RoU3VwcG9ydGVkICYgMHgwOCkKKwkJCQlEUCAocHJpbnRmICgiOCwgIikpOworCQkJRFAgKHByaW50ZiAoIiBCaXQgXG4iKSk7CisjZW5kaWYKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTc6CS8qIE51bWJlciBPZiBCYW5rcyBPbiBFYWNoIERldmljZSAqLworCQkJZGltbUluZm8tPm51bU9mQmFua3NPbkVhY2hEZXZpY2UgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTnVtYmVyIE9mIEJhbmtzIE9uIEVhY2ggQ2hpcDoJCQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPm51bU9mQmFua3NPbkVhY2hEZXZpY2UpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTg6CS8qIFN1cG9ydGVkIENhcyBMYXRlbmNpZXMgKi8KKworCQkJLyogICAgIEREUjoKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSAqIGJpdDcgfCBiaXQ2IHwgYml0NSB8IGJpdDQgfCBiaXQzIHwgYml0MiB8IGJpdDEgfCBiaXQwICoKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSBDQVMgPQkgKiBUQkQJfCBUQkQgIHwgMy41ICB8CSAgMyAgfCAyLjUgIHwgIDIgICB8IDEuNSAgfCAgIDEJICoKKwkJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCSBTRFJBTToKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSAqIGJpdDcgfCBiaXQ2IHwgYml0NSB8IGJpdDQgfCBiaXQzIHwgYml0MiB8IGJpdDEgfCBiaXQwICoKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSBDQVMgPQkgKiBUQkQJfCAgNyAgIHwgIDYgICB8CSA1ICAgfAk0ICAgfCAgMyAgIHwgICAyICB8ICAgMQkgKgorCQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzID0gZGF0YVtpXTsKKyNpZmRlZiBERUJVRworCQkJRFAgKHByaW50ZgorCQkJICAgICgiU3Vwb3J0ZWQgQ2FzIExhdGVuY2llczogKENMKQkJCSIpKTsKKwkJCWlmIChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSAwKSB7CS8qIFNEUkFNICovCisJCQkJZm9yIChrID0gMDsgayA8PSA3OyBrKyspIHsKKwkJCQkJaWYgKGRpbW1JbmZvLT4KKwkJCQkJICAgIHN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgKDEgPDwgaykpCisJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkgICAgKCIlZCwJCQkiLAorCQkJCQkJICAgICBrICsgMSkpOworCQkJCX0KKworCQkJfSBlbHNlIHsJLyogRERSLVJBTSAqLworCisJCQkJaWYgKGRpbW1JbmZvLT5zdXBvcnRlZENhc0xhdGVuY2llcyAmIDEpCisJCQkJCURQIChwcmludGYgKCIxLCAiKSk7CisJCQkJaWYgKGRpbW1JbmZvLT5zdXBvcnRlZENhc0xhdGVuY2llcyAmIDIpCisJCQkJCURQIChwcmludGYgKCIxLjUsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgNCkKKwkJCQkJRFAgKHByaW50ZiAoIjIsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgOCkKKwkJCQkJRFAgKHByaW50ZiAoIjIuNSwgIikpOworCQkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRDYXNMYXRlbmNpZXMgJiAxNikKKwkJCQkJRFAgKHByaW50ZiAoIjMsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgMzIpCisJCQkJCURQIChwcmludGYgKCIzLjUsICIpKTsKKworCQkJfQorCQkJRFAgKHByaW50ZiAoIlxuIikpOworI2VuZGlmCisJCQkvKiBDYWxjdWxhdGluZyBNQVggQ0FTIGxhdGVuY3kgKi8KKwkJCWZvciAoaiA9IDc7IGogPiAwOyBqLS0pIHsKKwkJCQlpZiAoKChkaW1tSW5mby0+CisJCQkJICAgICAgc3Vwb3J0ZWRDYXNMYXRlbmNpZXMgPj4gaikgJiAweDEpID09CisJCQkJICAgIDEpIHsKKwkJCQkJc3dpdGNoIChkaW1tSW5mby0+bWVtb3J5VHlwZSkgeworCQkJCQljYXNlIEREUjoKKwkJCQkJCS8qIENBUyBsYXRlbmN5IDEsIDEuNSwgMiwgMi41LCAzLCAzLjUgKi8KKwkJCQkJCXN3aXRjaCAoaikgeworCQkJCQkJY2FzZSA3OgorCQkJCQkJCURQIChwcmludGYKKwkJCQkJCQkgICAgKCJNYXguIENhcyBMYXRlbmNpZXMgKEREUik6CQkJCUVSUk9SICEhIVxuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0KKwkJCQkJCQkJRERSX0NMX0ZBVUxUOworCQkJCQkJCWhhbmcgKCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDY6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKToJCQkJRVJST1IgISEhXG4iKSk7CisJCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCQltYXhDbFN1cHBvcnRlZF9ERFIKKwkJCQkJCQkJPQorCQkJCQkJCQlERFJfQ0xfRkFVTFQ7CisJCQkJCQkJaGFuZyAoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNToKKwkJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIpOgkJCQkzLjUgY2xrJ3NcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9IEREUl9DTF8zXzU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKToJCQkJMyBjbGsncyBcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9IEREUl9DTF8zOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAzOgorCQkJCQkJCURQIChwcmludGYKKwkJCQkJCQkgICAgKCJNYXguIENhcyBMYXRlbmNpZXMgKEREUik6CQkJCTIuNSBjbGsncyBcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9IEREUl9DTF8yXzU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDI6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKToJCQkJMiBjbGsncyBcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9IEREUl9DTF8yOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAxOgorCQkJCQkJCURQIChwcmludGYKKwkJCQkJCQkgICAgKCJNYXguIENhcyBMYXRlbmNpZXMgKEREUik6CQkJCTEuNSBjbGsncyBcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9IEREUl9DTF8xXzU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJCS8qIHJvbmVuIC0gaW4gY2FzZSB3ZSBoYXZlIGEgRElNTSB3aXRoIG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3kKKwkJCQkJCSAgIGxvd2VyIHRoZW4gb3VyIFNEUkFNIGN5Y2xlIGNvdW50LCB3ZSB3b24ndCBiZSBhYmxlIHRvIHN1cHBvcnQgdGhpcyBDQUwKKwkJCQkJCSAgIGFuZCB3ZSB3aWxsIGhhdmUgdG8gdXNlIGxvd2VyIENBTC4gKG1pbnVzIC0gbWVhbnMgZnJvbSAzLjAgdG8gMi41KSAqLworCQkJCQkJaWYgKChkaW1tSW5mby0+CisJCQkJCQkgICAgIG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfTG9QCisJCQkJCQkgICAgIDwKKwkJCQkJCSAgICAgQ0ZHX0REUl9TRFJBTV9DWUNMRV9DT1VOVF9MT1ApCisJCQkJCQkgICAgfHwKKwkJCQkJCSAgICAoKGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgIG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfTG9QCisJCQkJCQkgICAgICA9PQorCQkJCQkJICAgICAgQ0ZHX0REUl9TRFJBTV9DWUNMRV9DT1VOVF9MT1ApCisJCQkJCQkgICAgICYmIChkaW1tSW5mby0+CisJCQkJCQkJIG1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfUm9QCisJCQkJCQkJIDwKKwkJCQkJCQkgQ0ZHX0REUl9TRFJBTV9DWUNMRV9DT1VOVF9ST1ApKSkKKwkJCQkJCXsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9CisJCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT4+IDE7CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIioqKiBDaGFuZ2UgYWN0dWFsIENhcyBMYXRlbmNpZXMgY2F1c2Ugb2YgbWluaW11bUN5Y2xlVGltZSBuIikpOworCQkJCQkJfQorCQkJCQkJLyogcm9uZW4gLSBjaGVja2lmIHRoZSBEaW1tIGZyZXF1ZW5jeSBjb21wYXJlZCB0byB0aGUgU3lzY2xvY2suICovCisJCQkJCQlpZiAoKGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1AKKwkJCQkJCSAgICAgPgorCQkJCQkJICAgICBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX0xPUCkKKwkJCQkJCSAgICB8fAorCQkJCQkJICAgICgoZGltbUluZm8tPgorCQkJCQkJICAgICAgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1AKKwkJCQkJCSAgICAgID09CisJCQkJCQkgICAgICBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX0xPUCkKKwkJCQkJCSAgICAgJiYgKGRpbW1JbmZvLT4KKwkJCQkJCQkgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Sb1AKKwkJCQkJCQkgPgorCQkJCQkJCSBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX1JPUCkpKQorCQkJCQkJeworCQkJCQkJCXByaW50ZiAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCQkJCQkJcHJpbnRmICgiKioqIHN5c0Nsb2NrIGlzIGhpZ2hlciB0aGFuIFNEUkFNJ3MgYWxsb3dlZCBmcmVxdWVuY3kgKioqXG4iKTsKKwkJCQkJCQlwcmludGYgKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCQkJCQkJCWhhbmcgKCk7CisJCQkJCQl9CisKKwkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQltYXhDQVNsYXRlbmN5U3VwcG9ydGVkX0xvUAorCQkJCQkJCT0KKwkJCQkJCQkxICsKKwkJCQkJCQkoaW50KSAoNSAqIGogLyAxMCk7CisJCQkJCQlpZiAoKCg1ICogaikgJSAxMCkgIT0gMCkKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENBU2xhdGVuY3lTdXBwb3J0ZWRfUm9QCisJCQkJCQkJCT0gNTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENBU2xhdGVuY3lTdXBwb3J0ZWRfUm9QCisJCQkJCQkJCT0gMDsKKwkJCQkJCURQIChwcmludGYKKwkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSIExvUC5Sb1AgTm90YXRpb24pOgklZC4lZCBcbiIsCisJCQkJCQkgICAgIGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Mb1AsCisJCQkJCQkgICAgIGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Sb1ApKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNEUkFNOgorCQkJCQkJLyogQ0FTIGxhdGVuY3kgMSwgMiwgMywgNCwgNSwgNiwgNyAqLworCQkJCQkJZGltbUluZm8tPm1heENsU3VwcG9ydGVkX1NEID0gajsJLyogIENhcyBMYXRlbmN5IEREUi1SQU0gQ29kZWQJCQkqLworCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChTRCk6ICVkXG4iLAorCQkJCQkJICAgICBkaW1tSW5mby0+CisJCQkJCQkgICAgIG1heENsU3VwcG9ydGVkX1NEKSk7CisJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Mb1AKKwkJCQkJCQk9IGo7CisJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Sb1AKKwkJCQkJCQk9IDA7CisJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkgICAgKCJNYXguIENhcyBMYXRlbmNpZXMgKEREUiBMb1AuUm9QIE5vdGF0aW9uKTogJWQuJWQgXG4iLAorCQkJCQkJICAgICBkaW1tSW5mby0+CisJCQkJCQkgICAgIG1heENBU2xhdGVuY3lTdXBwb3J0ZWRfTG9QLAorCQkJCQkJICAgICBkaW1tSW5mby0+CisJCQkJCQkgICAgIG1heENBU2xhdGVuY3lTdXBwb3J0ZWRfUm9QKSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDIxOgkvKiBCdWZmZXJlZCBBZGRyZXNzIEFuZCBDb250cm9sIElucHV0cyAqLworCQkJRFAgKHByaW50ZiAoIlxuTW9kdWwgQXR0cmlidXRlcyAoU1BEIEJ5dGUgMjEpOiBcbiIpKTsKKwkJCWRpbW1JbmZvLT5idWZmZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID0KKwkJCQlkYXRhW2ldICYgQklUMDsKKwkJCWRpbW1JbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPQorCQkJCShkYXRhW2ldICYgQklUMSkgPj4gMTsKKwkJCWRpbW1JbmZvLT5vbkNhcmRQTEwgPSAoZGF0YVtpXSAmIEJJVDIpID4+IDI7CisJCQlkaW1tSW5mby0+YnVmZmVyZWREUU1CaW5wdXRzID0gKGRhdGFbaV0gJiBCSVQzKSA+PiAzOworCQkJZGltbUluZm8tPnJlZ2lzdGVyZWREUU1CaW5wdXRzID0KKwkJCQkoZGF0YVtpXSAmIEJJVDQpID4+IDQ7CisJCQlkaW1tSW5mby0+ZGlmZmVyZW50aWFsQ2xvY2tJbnB1dCA9CisJCQkJKGRhdGFbaV0gJiBCSVQ1KSA+PiA1OworCQkJZGltbUluZm8tPnJlZHVuZGFudFJvd0FkZHJlc3NpbmcgPQorCQkJCShkYXRhW2ldICYgQklUNikgPj4gNjsKKyNpZmRlZiBERUJVRworCQkJaWYgKGRpbW1JbmZvLT5idWZmZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIEJ1ZmZlcmVkIEFkZHJlc3MvQ29udHJvbCBJbnB1dDoJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gQnVmZmVyZWQgQWRkcmVzcy9Db250cm9sIElucHV0OgkJTm8gXG4iKSk7CisKKwkJCWlmIChkaW1tSW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIFJlZ2lzdGVyZWQgQWRkcmVzcy9Db250cm9sIElucHV0OgkJWWVzIFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBSZWdpc3RlcmVkIEFkZHJlc3MvQ29udHJvbCBJbnB1dDoJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPm9uQ2FyZFBMTCA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBPbi1DYXJkIFBMTCAoY2xvY2spOgkJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIE9uLUNhcmQgUExMIChjbG9jayk6CQkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPmJ1ZmZlcmVkRFFNQmlucHV0cyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBCdWZmZXJkIERRTUIgSW5wdXRzOgkJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIEJ1ZmZlcmQgRFFNQiBJbnB1dHM6CQkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnJlZ2lzdGVyZWREUU1CaW5wdXRzID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIFJlZ2lzdGVyZWQgRFFNQiBJbnB1dHM6CQkJWWVzIFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBSZWdpc3RlcmVkIERRTUIgSW5wdXRzOgkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPmRpZmZlcmVudGlhbENsb2NrSW5wdXQgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gRGlmZmVyZW50aWFsIENsb2NrIElucHV0OgkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gRGlmZmVyZW50aWFsIENsb2NrIElucHV0OgkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnJlZHVuZGFudFJvd0FkZHJlc3NpbmcgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gcmVkdW5kYW50IFJvdyBBZGRyZXNzaW5nOgkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gcmVkdW5kYW50IFJvdyBBZGRyZXNzaW5nOgkJCU5vIFxuIikpOworCisjZW5kaWYKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMjI6CS8qIFN1cG9ydGVkIEF1dG9QcmVDaGFyZ2UgKi8KKwkJCURQIChwcmludGYgKCJcbk1vZHVsIEF0dHJpYnV0ZXMgKFNQRCBCeXRlIDIyKTogXG4iKSk7CisJCQlkaW1tSW5mby0+c3Vwb3J0ZWRFYXJseVJhc1ByZUNoYXJnZSA9IGRhdGFbaV0gJiBCSVQwOworCQkJZGltbUluZm8tPnN1cG9ydGVkQXV0b1ByZUNoYXJnZSA9CisJCQkJKGRhdGFbaV0gJiBCSVQxKSA+PiAxOworCQkJZGltbUluZm8tPnN1cG9ydGVkUHJlQ2hhcmdlQWxsID0KKwkJCQkoZGF0YVtpXSAmIEJJVDIpID4+IDI7CisJCQlkaW1tSW5mby0+c3Vwb3J0ZWRXcml0ZTFSZWFkQnVyc3QgPQorCQkJCShkYXRhW2ldICYgQklUMykgPj4gMzsKKwkJCWRpbW1JbmZvLT5zdXBvcnRlZDVQZXJjZW50TG93VkNDID0KKwkJCQkoZGF0YVtpXSAmIEJJVDQpID4+IDQ7CisJCQlkaW1tSW5mby0+c3Vwb3J0ZWQ1UGVyY2VudFVwcGVyVkNDID0KKwkJCQkoZGF0YVtpXSAmIEJJVDUpID4+IDU7CisjaWZkZWYgREVCVUcKKwkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRFYXJseVJhc1ByZUNoYXJnZSA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBFYXJseSBSYXMgUHJlY2hhcmdlOgkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gIEVhcmx5IFJhcyBQcmVjaGFyZ2U6CQkJTm8gXG4iKSk7CisKKwkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRBdXRvUHJlQ2hhcmdlID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIEF1dG9QcmVDaGFyZ2U6CQkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gIEF1dG9QcmVDaGFyZ2U6CQkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkUHJlQ2hhcmdlQWxsID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIFByZWNoYXJnZSBBbGw6CQkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gIFByZWNoYXJnZSBBbGw6CQkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkV3JpdGUxUmVhZEJ1cnN0ID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIFdyaXRlIDEvUmVhZEJ1cnN0OgkJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtICBXcml0ZSAxL1JlYWRCdXJzdDoJCQkJTm8gXG4iKSk7CisKKwkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWQ1UGVyY2VudExvd1ZDQyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBsb3dlciBWQ0MgdG9sZXJhbmNlOgkJCTUgUGVyY2VudCBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiCS0gbG93ZXIgVkNDIHRvbGVyYW5jZToJCQkxMCBQZXJjZW50IFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkNVBlcmNlbnRVcHBlclZDQyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSB1cHBlciBWQ0MgdG9sZXJhbmNlOgkJCTUgUGVyY2VudCBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gIHVwcGVyIFZDQyB0b2xlcmFuY2U6CQkJMTAgUGVyY2VudCBcbiIpKTsKKworI2VuZGlmCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDIzOgkvKiBNaW5pbXVtIEN5Y2xlIFRpbWUgQXQgTWF4aW11bSBDYXMgTGF0YW5jeSBNaW51cyAxICgybmQgaGlnaGVzdCBDTCkgKi8KKwkJCXNoaWZ0ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyA0IDogMjsKKwkJCW11bHQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDEwIDogMjU7CisJCQltYXNrTGVmdE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmMCA6IDB4ZmM7CisJCQltYXNrUmlnaHRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZiA6IDB4MDM7CisJCQlsZWZ0T2ZQb2ludCA9IChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdDsKKwkJCXJpZ2h0T2ZQb2ludCA9IChkYXRhW2ldICYgbWFza1JpZ2h0T2ZQb2ludCkgKiBtdWx0OworCQkJZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czFfTG9QID0KKwkJCQlsZWZ0T2ZQb2ludDsKKwkJCWRpbW1JbmZvLT5taW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5TWludXMxX1JvUCA9CisJCQkJcmlnaHRPZlBvaW50OworCQkJRFAgKHByaW50ZiAoIk1pbmltdW0gQ3ljbGUgVGltZSBBdCAybmQgaGlnaGVzdCBDYXNMYXRhbmN5ICgwID0gTm90IHN1cHBvcnRlZCk6ICVkLiVkIFtuc11cbiIsIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQpKTsJLypkaW1tSW5mby0+bWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeSAqLworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyNDoJLyogQ2xvY2sgVG8gRGF0YSBPdXQgMm5kIGhpZ2hlc3QgQ2FzIExhdGVuY3kgVmFsdWUgKi8KKwkJCWRpdiA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMTAwIDogMTA7CisJCQl0aW1lX3RtcCA9CisJCQkJKCgoZGF0YVtpXSAmIDB4ZjApID4+IDQpICogMTApICsKKwkJCQkoKGRhdGFbaV0gJiAweDBmKSk7CisJCQlsZWZ0T2ZQb2ludCA9IHRpbWVfdG1wIC8gZGl2OworCQkJcmlnaHRPZlBvaW50ID0gdGltZV90bXAgJSBkaXY7CisJCQlkaW1tSW5mby0+Y2xvY2tUb0RhdGFPdXRNaW51czFfTG9QID0gbGVmdE9mUG9pbnQ7CisJCQlkaW1tSW5mby0+Y2xvY2tUb0RhdGFPdXRNaW51czFfUm9QID0gcmlnaHRPZlBvaW50OworCQkJRFAgKHByaW50ZgorCQkJICAgICgiQ2xvY2sgVG8gRGF0YSBPdXQgKDJuZCBDTCB2YWx1ZSk6CQkJJWQuJTJkIFtuc11cbiIsCisJCQkgICAgIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMjU6CS8qIE1pbmltdW0gQ3ljbGUgVGltZSBBdCBNYXhpbXVtIENhcyBMYXRhbmN5IE1pbnVzIDIgKDNyZCBoaWdoZXN0IENMKSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDQgOiAyOworCQkJbXVsdCA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMTAgOiAyNTsKKwkJCW1hc2tMZWZ0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweGYwIDogMHhmYzsKKwkJCW1hc2tSaWdodE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmIDogMHgwMzsKKwkJCWxlZnRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrTGVmdE9mUG9pbnQpID4+IHNoaWZ0OworCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrUmlnaHRPZlBvaW50KSAqIG11bHQ7CisJCQlkaW1tSW5mby0+bWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMl9Mb1AgPQorCQkJCWxlZnRPZlBvaW50OworCQkJZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czJfUm9QID0KKwkJCQlyaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmICgiTWluaW11bSBDeWNsZSBUaW1lIEF0IDNyZCBoaWdoZXN0IENhc0xhdGFuY3kgKDAgPSBOb3Qgc3VwcG9ydGVkKTogJWQuJWQgW25zXVxuIiwgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOwkvKmRpbW1JbmZvLT5taW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5ICovCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDI2OgkvKiBDbG9jayBUbyBEYXRhIE91dCAzcmQgaGlnaGVzdCBDYXMgTGF0ZW5jeSBWYWx1ZSAqLworCQkJZGl2ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAxMDAgOiAxMDsKKwkJCXRpbWVfdG1wID0KKwkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCSgoZGF0YVtpXSAmIDB4MGYpKTsKKwkJCWxlZnRPZlBvaW50ID0gdGltZV90bXAgLyBkaXY7CisJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIGRpdjsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dE1pbnVzMl9Mb1AgPSBsZWZ0T2ZQb2ludDsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dE1pbnVzMl9Sb1AgPSByaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJDbG9jayBUbyBEYXRhIE91dCAoM3JkIENMIHZhbHVlKToJCQklZC4lMmQgW25zXVxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyNzoJLyogTWluaW11bSBSb3cgUHJlY2hhcmdlIFRpbWUgKi8KKwkJCXNoaWZ0ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAyIDogMDsKKwkJCW1hc2tMZWZ0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweGZjIDogMHhmZjsKKwkJCW1hc2tSaWdodE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHgwMyA6IDB4MDA7CisJCQlsZWZ0T2ZQb2ludCA9ICgoZGF0YVtpXSAmIG1hc2tMZWZ0T2ZQb2ludCkgPj4gc2hpZnQpOworCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrUmlnaHRPZlBvaW50KSAqIDI1OworCisJCQlkaW1tSW5mby0+bWluUm93UHJlY2hhcmdlVGltZSA9ICgobGVmdE9mUG9pbnQgKiAxMDApICsgcmlnaHRPZlBvaW50KTsJLyogbWVhc3VyZWQgaW4gbiB0aW1lcyAxMHBzIEludGVydmFscyAqLworCQkJdHJwX2Nsb2NrcyA9CisJCQkJKGRpbW1JbmZvLT5taW5Sb3dQcmVjaGFyZ2VUaW1lICsKKwkJCQkgKHRtZW1jbGsgLSAxKSkgLyB0bWVtY2xrOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiKioqIDEgY2xvY2sgY3ljbGUgPSAlbGQgIDEwcHMgaW50ZXJ2YWxscyA9ICVsZC4lbGQgbnMqKioqXG4iLAorCQkJICAgICB0bWVtY2xrLCB0bWVtY2xrIC8gMTAwLCB0bWVtY2xrICUgMTAwKSk7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNaW5pbXVtIFJvdyBQcmVjaGFyZ2UgVGltZSBbbnNdOgkJJWQuJTJkID0gaW4gQ2xrIGN5Y2xlcyAlZFxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCwgdHJwX2Nsb2NrcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyODoJLyogTWluaW11bSBSb3cgQWN0aXZlIHRvIFJvdyBBY3RpdmUgVGltZSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDIgOiAwOworCQkJbWFza0xlZnRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZmMgOiAweGZmOworCQkJbWFza1JpZ2h0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweDAzIDogMHgwMDsKKwkJCWxlZnRPZlBvaW50ID0gKChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdCk7CisJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tSaWdodE9mUG9pbnQpICogMjU7CisKKwkJCWRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSA9ICgobGVmdE9mUG9pbnQgKiAxMDApICsgcmlnaHRPZlBvaW50KTsJLyogbWVhc3VyZWQgaW4gMTAwbnMgSW50ZXJ2YWxzICovCisJCQl0cnJkX2Nsb2NrcyA9CisJCQkJKGRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSArCisJCQkJICh0bWVtY2xrIC0gMSkpIC8gdG1lbWNsazsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1pbmltdW0gUm93IEFjdGl2ZSAtVG8tIFJvdyBBY3RpdmUgRGVsYXkgW25zXToJJWQuJTJkID0gaW4gQ2xrIGN5Y2xlcyAlZFxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCwgdHJwX2Nsb2NrcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyOToJLyogTWluaW11bSBSYXMtVG8tQ2FzIERlbGF5ICovCisJCQlzaGlmdCA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMiA6IDA7CisJCQltYXNrTGVmdE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmYyA6IDB4ZmY7CisJCQltYXNrUmlnaHRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4MDMgOiAweDAwOworCQkJbGVmdE9mUG9pbnQgPSAoKGRhdGFbaV0gJiBtYXNrTGVmdE9mUG9pbnQpID4+IHNoaWZ0KTsKKwkJCXJpZ2h0T2ZQb2ludCA9IChkYXRhW2ldICYgbWFza1JpZ2h0T2ZQb2ludCkgKiAyNTsKKworCQkJZGltbUluZm8tPm1pblJvd0FjdGl2ZVJvd0FjdGl2ZURlbGF5ID0gKChsZWZ0T2ZQb2ludCAqIDEwMCkgKyByaWdodE9mUG9pbnQpOwkvKiBtZWFzdXJlZCBpbiAxMDBucyBJbnRlcnZhbHMgKi8KKwkJCXRyY2RfY2xvY2tzID0KKwkJCQkoZGltbUluZm8tPm1pblJvd0FjdGl2ZVJvd0FjdGl2ZURlbGF5ICsKKwkJCQkgKHRtZW1jbGsgLSAxKSkgLyB0bWVtY2xrOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTWluaW11bSBSYXMtVG8tQ2FzIERlbGF5IFtuc106CQkJJWQuJTJkID0gaW4gQ2xrIGN5Y2xlcyAlZFxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCwgdHJwX2Nsb2NrcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAzMDoJLyogTWluaW11bSBSYXMgUHVsc2UgV2lkdGggKi8KKwkJCWRpbW1JbmZvLT5taW5SYXNQdWxzZVdpZHRoID0gZGF0YVtpXTsKKwkJCXRyYXNfY2xvY2tzID0KKwkJCQkoTlN0bzEwUFMgKGRhdGFbaV0pICsKKwkJCQkgKHRtZW1jbGsgLSAxKSkgLyB0bWVtY2xrOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTWluaW11bSBSYXMgUHVsc2UgV2lkdGggW25zXToJCQklZCA9IGluIENsayBjeWNsZXMgJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5taW5SYXNQdWxzZVdpZHRoLCB0cmFzX2Nsb2NrcykpOworCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDMxOgkvKiBNb2R1bGUgQmFuayBEZW5zaXR5ICovCisJCQlkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTW9kdWxlIEJhbmsgRGVuc2l0eToJCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSkpOworI2lmZGVmIERFQlVHCisJCQlEUCAocHJpbnRmCisJCQkgICAgKCIqKiogT2ZmZXJlZCBEZW5zaXRpZXMgKG1vcmUgdGhhbiAxID0gTXVsdGlzaXplLU1vZHVsZSk6ICIpKTsKKwkJCXsKKwkJCQlpZiAoZGltbUluZm8tPm1vZHVsZUJhbmtEZW5zaXR5ICYgMSkKKwkJCQkJRFAgKHByaW50ZiAoIjRNQiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiAyKQorCQkJCQlEUCAocHJpbnRmICgiOE1CLCAiKSk7CisJCQkJaWYgKGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSAmIDQpCisJCQkJCURQIChwcmludGYgKCIxNk1CLCAiKSk7CisJCQkJaWYgKGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSAmIDgpCisJCQkJCURQIChwcmludGYgKCIzMk1CLCAiKSk7CisJCQkJaWYgKGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSAmIDE2KQorCQkJCQlEUCAocHJpbnRmICgiNjRNQiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiAzMikKKwkJCQkJRFAgKHByaW50ZiAoIjEyOE1CLCAiKSk7CisJCQkJaWYgKChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiA2NCkKKwkJCQkgICAgfHwgKGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSAmIDEyOCkpIHsKKwkJCQkJRFAgKHByaW50ZiAoIkVSUk9SLCAiKSk7CisJCQkJCWhhbmcgKCk7CisJCQkJfQorCQkJfQorCQkJRFAgKHByaW50ZiAoIlxuIikpOworI2VuZGlmCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDMyOgkvKiBBZGRyZXNzIEFuZCBDb21tYW5kIFNldHVwIFRpbWUgKG1lYXN1cmVkIGluIG5zLzEwMDApICovCisJCQlzaWduID0gMTsKKwkJCXN3aXRjaCAoZGltbUluZm8tPm1lbW9yeVR5cGUpIHsKKwkJCWNhc2UgRERSOgorCQkJCXRpbWVfdG1wID0KKwkJCQkJKCgoZGF0YVtpXSAmIDB4ZjApID4+IDQpICogMTApICsKKwkJCQkJKChkYXRhW2ldICYgMHgwZikpOworCQkJCWxlZnRPZlBvaW50ID0gdGltZV90bXAgLyAxMDA7CisJCQkJcmlnaHRPZlBvaW50ID0gdGltZV90bXAgJSAxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNEUkFNOgorCQkJCWxlZnRPZlBvaW50ID0gKGRhdGFbaV0gJiAweGYwKSA+PiA0OworCQkJCWlmIChsZWZ0T2ZQb2ludCA+IDcpIHsKKwkJCQkJbGVmdE9mUG9pbnQgPSBkYXRhW2ldICYgMHg3MCA+PiA0OworCQkJCQlzaWduID0gLTE7CisJCQkJfQorCQkJCXJpZ2h0T2ZQb2ludCA9IChkYXRhW2ldICYgMHgwZik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkaW1tSW5mby0+YWRkckFuZENvbW1hbmRTZXR1cFRpbWUgPQorCQkJCShsZWZ0T2ZQb2ludCAqIDEwMCArIHJpZ2h0T2ZQb2ludCkgKiBzaWduOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiQWRkcmVzcyBBbmQgQ29tbWFuZCBTZXR1cCBUaW1lIFtuc106CQklZC4lZFxuIiwKKwkJCSAgICAgc2lnbiAqIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMzM6CS8qIEFkZHJlc3MgQW5kIENvbW1hbmQgSG9sZCBUaW1lICovCisJCQlzaWduID0gMTsKKwkJCXN3aXRjaCAoZGltbUluZm8tPm1lbW9yeVR5cGUpIHsKKwkJCWNhc2UgRERSOgorCQkJCXRpbWVfdG1wID0KKwkJCQkJKCgoZGF0YVtpXSAmIDB4ZjApID4+IDQpICogMTApICsKKwkJCQkJKChkYXRhW2ldICYgMHgwZikpOworCQkJCWxlZnRPZlBvaW50ID0gdGltZV90bXAgLyAxMDA7CisJCQkJcmlnaHRPZlBvaW50ID0gdGltZV90bXAgJSAxMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNEUkFNOgorCQkJCWxlZnRPZlBvaW50ID0gKGRhdGFbaV0gJiAweGYwKSA+PiA0OworCQkJCWlmIChsZWZ0T2ZQb2ludCA+IDcpIHsKKwkJCQkJbGVmdE9mUG9pbnQgPSBkYXRhW2ldICYgMHg3MCA+PiA0OworCQkJCQlzaWduID0gLTE7CisJCQkJfQorCQkJCXJpZ2h0T2ZQb2ludCA9IChkYXRhW2ldICYgMHgwZik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkaW1tSW5mby0+YWRkckFuZENvbW1hbmRIb2xkVGltZSA9CisJCQkJKGxlZnRPZlBvaW50ICogMTAwICsgcmlnaHRPZlBvaW50KSAqIHNpZ247CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJBZGRyZXNzIEFuZCBDb21tYW5kIEhvbGQgVGltZSBbbnNdOgkJJWQuJWRcbiIsCisJCQkgICAgIHNpZ24gKiBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDM0OgkvKiBEYXRhIElucHV0IFNldHVwIFRpbWUgKi8KKwkJCXNpZ24gPSAxOworCQkJc3dpdGNoIChkaW1tSW5mby0+bWVtb3J5VHlwZSkgeworCQkJY2FzZSBERFI6CisJCQkJdGltZV90bXAgPQorCQkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCQkoKGRhdGFbaV0gJiAweDBmKSk7CisJCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIDEwMDsKKwkJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RSQU06CisJCQkJbGVmdE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4ZjApID4+IDQ7CisJCQkJaWYgKGxlZnRPZlBvaW50ID4gNykgeworCQkJCQlsZWZ0T2ZQb2ludCA9IGRhdGFbaV0gJiAweDcwID4+IDQ7CisJCQkJCXNpZ24gPSAtMTsKKwkJCQl9CisJCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiAweDBmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRpbW1JbmZvLT5kYXRhSW5wdXRTZXR1cFRpbWUgPQorCQkJCShsZWZ0T2ZQb2ludCAqIDEwMCArIHJpZ2h0T2ZQb2ludCkgKiBzaWduOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiRGF0YSBJbnB1dCBTZXR1cCBUaW1lIFtuc106CQkJJWQuJWRcbiIsCisJCQkgICAgIHNpZ24gKiBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDM1OgkvKiBEYXRhIElucHV0IEhvbGQgVGltZSAqLworCQkJc2lnbiA9IDE7CisJCQlzd2l0Y2ggKGRpbW1JbmZvLT5tZW1vcnlUeXBlKSB7CisJCQljYXNlIEREUjoKKwkJCQl0aW1lX3RtcCA9CisJCQkJCSgoKGRhdGFbaV0gJiAweGYwKSA+PiA0KSAqIDEwKSArCisJCQkJCSgoZGF0YVtpXSAmIDB4MGYpKTsKKwkJCQlsZWZ0T2ZQb2ludCA9IHRpbWVfdG1wIC8gMTAwOworCQkJCXJpZ2h0T2ZQb2ludCA9IHRpbWVfdG1wICUgMTAwOworCQkJCWJyZWFrOworCQkJY2FzZSBTRFJBTToKKwkJCQlsZWZ0T2ZQb2ludCA9IChkYXRhW2ldICYgMHhmMCkgPj4gNDsKKwkJCQlpZiAobGVmdE9mUG9pbnQgPiA3KSB7CisJCQkJCWxlZnRPZlBvaW50ID0gZGF0YVtpXSAmIDB4NzAgPj4gNDsKKwkJCQkJc2lnbiA9IC0xOworCQkJCX0KKwkJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4MGYpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGltbUluZm8tPmRhdGFJbnB1dEhvbGRUaW1lID0KKwkJCQkobGVmdE9mUG9pbnQgKiAxMDAgKyByaWdodE9mUG9pbnQpICogc2lnbjsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkRhdGEgSW5wdXQgSG9sZCBUaW1lIFtuc106CQkJJWQuJWRcblxuIiwKKwkJCSAgICAgc2lnbiAqIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCQl9CisJfQorCS8qIGNhbGN1bGF0aW5nIHRoZSBzZHJhbSBkZW5zaXR5ICovCisJZm9yIChpID0gMDsKKwkgICAgIGkgPCBkaW1tSW5mby0+bnVtT2ZSb3dBZGRyZXNzZXMgKyBkaW1tSW5mby0+bnVtT2ZDb2xBZGRyZXNzZXM7CisJICAgICBpKyspIHsKKwkJZGVuc2l0eSA9IGRlbnNpdHkgKiAyOworCX0KKwlkaW1tSW5mby0+ZGV2aWNlRGVuc2l0eSA9IGRlbnNpdHkgKiBkaW1tSW5mby0+bnVtT2ZCYW5rc09uRWFjaERldmljZSAqCisJCWRpbW1JbmZvLT5zZHJhbVdpZHRoOworCWRpbW1JbmZvLT5udW1iZXJPZkRldmljZXMgPQorCQkoZGltbUluZm8tPmRhdGFXaWR0aCAvIGRpbW1JbmZvLT5zZHJhbVdpZHRoKSAqCisJCWRpbW1JbmZvLT5udW1PZk1vZHVsZUJhbmtzOworCWRldmljZXNGb3JFcnJDaGVjayA9CisJCShkaW1tSW5mby0+ZGF0YVdpZHRoIC0gNjQpIC8gZGltbUluZm8tPnNkcmFtV2lkdGg7CisJaWYgKChkaW1tSW5mby0+ZXJyb3JDaGVja1R5cGUgPT0gMHgxKQorCSAgICB8fCAoZGltbUluZm8tPmVycm9yQ2hlY2tUeXBlID09IDB4MikKKwkgICAgfHwgKGRpbW1JbmZvLT5lcnJvckNoZWNrVHlwZSA9PSAweDMpKSB7CisJCWRpbW1JbmZvLT5zaXplID0KKwkJCShkaW1tSW5mby0+ZGV2aWNlRGVuc2l0eSAvIDgpICoKKwkJCShkaW1tSW5mby0+bnVtYmVyT2ZEZXZpY2VzIC0KKwkJCSAvKiByb25lbiBvbiB0aGUgMUcgZGltbSB3ZSBnZXQgd3JvbmcgdmFsdWUuICh3YXMgZGV2aWNlc0ZvckVyckNoZWNrKSAqLworCQkJIGRpbW1JbmZvLT5udW1iZXJPZkRldmljZXMgLyA4KTsKKwl9IGVsc2UgeworCQlkaW1tSW5mby0+c2l6ZSA9CisJCQkoZGltbUluZm8tPmRldmljZURlbnNpdHkgLyA4KSAqCisJCQlkaW1tSW5mby0+bnVtYmVyT2ZEZXZpY2VzOworCX0KKworCS8qIGNvbXB1dGUgdGhlIG1vZHVsZSBEUkIgc2l6ZSAqLworCXRtcCA9ICgxIDw8CisJICAgICAgIChkaW1tSW5mby0+bnVtT2ZSb3dBZGRyZXNzZXMgKyBkaW1tSW5mby0+bnVtT2ZDb2xBZGRyZXNzZXMpKTsKKwl0bXAgKj0gZGltbUluZm8tPm51bU9mTW9kdWxlQmFua3M7CisJdG1wICo9IGRpbW1JbmZvLT5zZHJhbVdpZHRoOworCXRtcCA9IHRtcCA+PiAyNDsJLyogZGl2IGJ5IDB4NDAwMDAwMCAoNjRNKQkqLworCWRpbW1JbmZvLT5kcmJfc2l6ZSA9ICh1Y2hhcikgdG1wOworCURQIChwcmludGYgKCJNb2R1bGUgRFJCIHNpemUgKG4qNjRNYml0KTogJWRcbiIsIGRpbW1JbmZvLT5kcmJfc2l6ZSkpOworCisJLyogdHJ5IGEgQ0FTIGxhdGVuY3kgb2YgMyBmaXJzdC4uLiAqLworCisJLyogYml0IDEgaXMgQ0wyLCBiaXQgMiBpcyBDTDMgKi8KKwlzdXBwX2NhbCA9IChkaW1tSW5mby0+c3Vwb3J0ZWRDYXNMYXRlbmNpZXMgJiAweDYpID4+IDE7CisKKwljYWxfdmFsID0gMDsKKwlpZiAoc3VwcF9jYWwgJiAzKSB7CisJCWlmIChOUzEwdG8xMFBTIChkYXRhWzldKSA8PSB0bWVtY2xrKQorCQkJY2FsX3ZhbCA9IDM7CisJfQorCisJLyogdGhlbiAyLi4uICovCisJaWYgKHN1cHBfY2FsICYgMikgeworCQlpZiAoTlMxMHRvMTBQUyAoZGF0YVsyM10pIDw9IHRtZW1jbGspCisJCQljYWxfdmFsID0gMjsKKwl9CisKKwlEUCAocHJpbnRmICgiY2FsX3ZhbCA9ICVkXG4iLCBjYWxfdmFsKSk7CisKKwkvKiBidW1tZXIsIGRpZCd0IHdvcmsuLi4gKi8KKwlpZiAoY2FsX3ZhbCA9PSAwKSB7CisJCURQIChwcmludGYgKCJDb3VsZG4ndCBmaW5kIGEgZ29vZCBDQVMgbGF0ZW5jeVxuIikpOworCQloYW5nICgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKKworI2VuZGlmCit9CisKKy8qIHNldHMgdXAgdGhlIEdUIHByb3Blcmx5IHdpdGggaW5mb3JtYXRpb24gcGFzc2VkIGluICovCitpbnQgc2V0dXBfc2RyYW0gKEFVWF9NRU1fRElNTV9JTkZPICogaW5mbykKK3sKKwl1bG9uZyB0bXAsIGNoZWNrOworCXVsb25nIHRtcF9zZHJhbV9tb2RlID0gMDsJLyogMHgxNDFjICovCisJdWxvbmcgdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMDsJLyogMHgxNDA0ICovCisJaW50IGk7CisKKwkvKiBhZGRlZCA4LzIxLzIwMDMgUC4gTWFyY2hlc2UgKi8KKwl1bnNpZ25lZCBpbnQgc2RyYW1fY29uZmlnX3JlZzsKKworCS8qIGFkZGVkIDEwLzEwLzIwMDMgUC4gTWFyY2hlc2UgKi8KKwl1bG9uZyBzZHJhbV9jaGlwX3NpemU7CisKKwkvKiBzYW5pdHkgY2hlY2tpbmcgKi8KKwlpZiAoIWluZm8tPm51bU9mTW9kdWxlQmFua3MpIHsKKwkJcHJpbnRmICgic2V0dXBfc2RyYW0gY2FsbGVkIHdpdGggMCBiYW5rc1xuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIGRlbGF5IGxpbmUgKi8KKwlzZXRfZGZjZGxJbml0ICgpOwkvKiBtYXkgYmUgaXRzIG5vdCBuZWVkZWQgKi8KKwlEUCAocHJpbnRmICgiRGVsYXkgbGluZSBzZXQgZG9uZVxuIikpOworCisJLyogc2V0IFNEUkFNIG1vZGUgTk9QICovIC8qIFRvX2RvIGNoZWNrIGl0ICovCisJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVSQVRJT04sIDB4NSk7CisJd2hpbGUgKEdUUkVHUkVBRCAoU0RSQU1fT1BFUkFUSU9OKSAhPSAwKSB7CisJCURQIChwcmludGYKKwkJICAgICgiXG4qKiogU0RSQU1fT1BFUkFUSU9OIDE0MTg6IE1vZHVsZSBzdGlsbCBidXN5IC4uLiBwbGVhc2Ugd2FpdC4uLiAqKipcbiIpKTsKKwl9CisKKwkvKiBTRFJBTSBjb25maWd1cmF0aW9uICovCisvKiBhZGRlZCA4LzIxLzIwMDMgUC4gTWFyY2hlc2UgKi8KKy8qIGNvZGUgYWxsb3dzIHVzYWdlIG9mIHJlZ2lzdGVyZWQgRElNTVMgKi8KKworCS8qIGZpZ3VyZSBvdXQgdGhlIG1lbW9yeSByZWZyZXNoIGludGVybmFsICovCisJc3dpdGNoIChpbmZvLT5SZWZyZXNoSW50ZXJ2YWwpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4ODA6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAxNS42MjUgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSAxNS42MjUgKiAoZmxvYXQpIENGR19CVVNfSFopCisJCQkJCS8gKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MToKKwljYXNlIDB4ODE6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAzLjkgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSAzLjkgKiAoZmxvYXQpIENGR19CVVNfSFopIC8KKwkJCQkJKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MjoKKwljYXNlIDB4ODI6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyA3LjggdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSA3LjggKiAoZmxvYXQpIENGR19CVVNfSFopIC8KKwkJCQkJKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MzoKKwljYXNlIDB4ODM6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAzMS4zIHVzZWMgKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9CisJCQkodW5zaWduZWQgaW50KSAoKChmbG9hdCkgMzEuMyAqIChmbG9hdCkgQ0ZHX0JVU19IWikgLworCQkJCQkoZmxvYXQpIDEwMDAwMDAuMCk7CisJCWJyZWFrOworCWNhc2UgMHg0OgorCWNhc2UgMHg4NDoJCS8qIHJlZnJlc2ggcGVyaW9kIGlzIDYyLjUgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSA2Mi41ICogKGZsb2F0KSBDRkdfQlVTX0haKSAvCisJCQkJCShmbG9hdCkgMTAwMDAwMC4wKTsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJY2FzZSAweDg1OgkJLyogcmVmcmVzaCBwZXJpb2QgaXMgMTI1IHVzZWMgKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9CisJCQkodW5zaWduZWQgaW50KSAoKChmbG9hdCkgMTI1ICogKGZsb2F0KSBDRkdfQlVTX0haKSAvCisJCQkJCShmbG9hdCkgMTAwMDAwMC4wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIHJlZnJlc2ggcGVyaW9kIHVuZGVmaW5lZCAqLworCQlwcmludGYgKCJEUkFNIHJlZnJlc2ggcGVyaW9kIGlzIHVua25vd24hXG4iKTsKKwkJcHJpbnRmICgiQWJvcnRpbmcgRFJBTSBzZXR1cCB3aXRoIGFuIGVycm9yXG4iKTsKKwkJaGFuZyAoKTsKKwkJYnJlYWs7CisJfQorCURQIChwcmludGYgKCJjYWxjdWxhdGVkIHJlZnJlc2ggaW50ZXJ2YWwgJTB4XG4iLCBzZHJhbV9jb25maWdfcmVnKSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHJlZnJlc2ggdmFsdWUgaXMgb25seSAxNCBiaXRzICovCisJaWYgKHNkcmFtX2NvbmZpZ19yZWcgPiAweDFmZmYpCisJCXNkcmFtX2NvbmZpZ19yZWcgPSAweDFmZmY7CisJRFAgKHByaW50ZiAoImFkanVzdGVkIHJlZnJlc2ggaW50ZXJ2YWwgJTB4XG4iLCBzZHJhbV9jb25maWdfcmVnKSk7CisKKwkvKiB3ZSB3YW50IHBoeXNpY2FsIGJhbmsgaW50ZXJsZWF2aW5nIGFuZCAqLworCS8qIHZpcnR1YWwgYmFuayBpbnRlcmxlYXZpbmcgZW5hYmxlZCBzbyBkbyBub3RoaW5nICovCisJLyogc2luY2UgdGhlc2UgYml0cyBuZWVkIHRvIGJlIHplcm8gdG8gZW5hYmxlIHRoZSBpbnRlcmxlYXZpbmcgKi8KKworCS8qICByZWdpc3RlcmVkIERSQU0gPyAqLworCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkgeworCQkvKiBpdCdzIHJlZ2lzdGVyZWQgRFJBTSwgc28gc2V0IHRoZSByZWcuIERSQU0gYml0ICovCisJCXNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnIHwgQklUMTc7CisJCURQIChwcmludGYgKCJFbmFibGluZyByZWdpc3RlcmVkIERSQU0gYml0XG4iKSk7CisJfQorCS8qIHR1cm4gb24gRFJBTSBFQ0M/ICovCisjaWZkZWYgQ09ORklHX01WNjQzNjBfRUNDCisJaWYgKGluZm8tPmVycm9yQ2hlY2tUeXBlID09IDB4MikgeworCQkvKiBEUkFNIGhhcyBFQ0MsIHNvIHR1cm4gaXQgb24gKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9IHNkcmFtX2NvbmZpZ19yZWcgfCBCSVQxODsKKwkJRFAgKHByaW50ZiAoIkVuYWJsaW5nIEVDQ1xuIikpOworCX0KKyNlbmRpZgorCS8qIHNldCB0aGUgZGF0YSBEUVMgcGluIGNvbmZpZ3VyYXRpb24gKi8KKwlzd2l0Y2ggKGluZm8tPnNkcmFtV2lkdGgpIHsKKwljYXNlIDB4NDoJCS8qIG1lbW9yeSBpcyB4NCAqLworCQlzZHJhbV9jb25maWdfcmVnID0gc2RyYW1fY29uZmlnX3JlZyB8IEJJVDIwIHwgQklUMjE7CisJCURQIChwcmludGYgKCJEYXRhIERRUyBwaW5zIHNldCBmb3IgMTYgcGluc1xuIikpOworCQlicmVhazsKKwljYXNlIDB4ODoJCS8qIG1lbW9yeSBpcyB4OCBvciB4MTYgKi8KKwljYXNlIDB4MTA6CisJCXNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnIHwgQklUMjE7CisJCURQIChwcmludGYgKCJEYXRhIERRUyBwaW5zIHNldCBmb3IgOCBwaW5zXG4iKSk7CisJCWJyZWFrOworCWNhc2UgMHgyMDoJCS8qIG1lbW9yeSBpcyB4MzIgKi8KKwkJLyogYm90aCBiaXRzIGFyZSBjbGVhcmVkIGZvciB4MzIgc28gbm90aGluZyB0byBkbyAqLworCQlEUCAocHJpbnRmICgiRGF0YSBEUVMgcGlucyBzZXQgZm9yIDIgcGluc1xuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogbWVtb3J5IHdpZHRoIHVuc3VwcG9ydGVkICovCisJCXByaW50ZiAoIkRSQU0gY2hpcCB3aWR0aCBpcyB1bmtub3duIVxuIik7CisJCXByaW50ZiAoIkFib3J0aW5nIERSQU0gc2V0dXAgd2l0aCBhbiBlcnJvclxuIik7CisJCWhhbmcgKCk7CisJCWJyZWFrOworCX0KKworCS8qIHBlcmZvcm0gcmVhZCBidWZmZXIgYXNzaWdubWVudHMgKi8KKwkvKiB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBQb3dlci11cCBkZWZhdWx0cyAqLworCS8qIGJpdCAyNiA9IENQVSA9IGJ1ZmZlciAxICovCisJLyogYml0IDI3ID0gUENJIGJ1cyAjMCA9IGJ1ZmZlciAwICovCisJLyogYml0IDI4ID0gUENJIGJ1cyAjMSA9IGJ1ZmZlciAwICovCisJLyogYml0IDI5ID0gTVBTQyA9IGJ1ZmZlciAwICovCisJLyogYml0IDMwID0gSURNQSA9IGJ1ZmZlciAwICovCisJLyogYml0IDMxID0gR2lnYWJpdCA9IGJ1ZmZlciAwICovCisJc2RyYW1fY29uZmlnX3JlZyA9IHNkcmFtX2NvbmZpZ19yZWcgfCBCSVQyNjsKKwkvKiAgc2RyYW1fY29uZmlnX3JlZyA9IHNkcmFtX2NvbmZpZ19yZWcgfCAweDU4MDAwMDAwOyAqLworCS8qIHNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnICYgMHhmZmZmZmYwMDsgICovCisKKwkvKiB3cml0ZSB0aGUgdmFsdWUgaW50byB0aGUgU0RSQU0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCUdUX1JFR19XUklURSAoU0RSQU1fQ09ORklHLCBzZHJhbV9jb25maWdfcmVnKTsKKwlEUCAocHJpbnRmCisJICAgICgiT09PT09PT09PIHNkcmFtX2NvbmYgMHgxNDAwOiAlMDh4XG4iLAorCSAgICAgR1RSRUdSRUFEIChTRFJBTV9DT05GSUcpKSk7CisKKwkvKiBTRFJBTSBvcGVuIHBhZ2VzIGNvbnRyb2wga2VlcCBvcGVuIGFzIG11Y2ggYXMgSSBjYW4gKi8KKwlHVF9SRUdfV1JJVEUgKFNEUkFNX09QRU5fUEFHRVNfQ09OVFJPTCwgMHgwKTsKKwlEUCAocHJpbnRmCisJICAgICgic2RyYW1fb3Blbl9wYWdlc19jb250cm9sbCAweDE0MTQ6ICUwOHhcbiIsCisJICAgICBHVFJFR1JFQUQgKFNEUkFNX09QRU5fUEFHRVNfQ09OVFJPTCkpKTsKKworCS8qIFNEUkFNIERfVU5JVF9DT05UUk9MX0xPVyAweDE0MDQgKi8KKwl0bXAgPSAoR1RSRUdSRUFEIChEX1VOSVRfQ09OVFJPTF9MT1cpICYgMHgwMSk7CS8qIENsb2NrIERvbWFpbiBTeW5jIGZyb20gcG93ZXIgb24gcmVzZXQgKi8KKwlpZiAodG1wID09IDApCisJCURQIChwcmludGYgKCJDb3JlIFNpZ25hbHMgYXJlIHN5bmMgKGJ5IEhXLVNldHRpbmcpISEhXG4iKSk7CisJZWxzZQorCQlEUCAocHJpbnRmCisJCSAgICAoIkNvcmUgU2lnbmFscyBzeW5jcy4gYXJlIGJ5cGFzc2VkIChieSBIVy1TZXR0aW5nKSEhIVxuIikpOworCisJLyogU0RSQU0gc2V0IENBUyBMYXRlbmN5IGFjY29yZGluZyB0byBTUEQgaW5mb3JtYXRpb24gKi8KKwlzd2l0Y2ggKGluZm8tPm1lbW9yeVR5cGUpIHsKKwljYXNlIFNEUkFNOgorCQlwcmludGYgKCIjIyMgU0QtUkFNIG5vdCBzdXBwb3J0ZWQgISEhXG4iKTsKKwkJcHJpbnRmICgiQWJvcnRpbmchISFcbiIpOworCQloYW5nICgpOworCQkvKiBUb0RvIGZpbGwgU0QtUkFNIGlmIG5lZWRlZCAhISEhISAqLworCQlicmVhazsKKwkJLyogQ2FsY3VsYXRlIHRoZSBzZXR0aW5ncyBmb3IgU0RSQU0gbW9kZSBhbmQgRHVuaXQgY29udHJvbCBsb3cgcmVnaXN0ZXJzICovCisJCS8qIFZhbHVlcyBzZXQgYWNjb3JkaW5nIHRvIHRlY2huaWNhbCBidWxsZXRpbiBUQi05MiByZXYuIGMgKi8KKwljYXNlIEREUjoKKwkJRFAgKHByaW50ZiAoIiMjIyBTRVQtQ0wgZm9yIEREUi1SQU1cbiIpKTsKKwkJc3dpdGNoIChpbmZvLT5tYXhDbFN1cHBvcnRlZF9ERFIpIHsKKwkJY2FzZSBERFJfQ0xfMzoKKwkJCXRtcF9zZHJhbV9tb2RlID0gMHgzMjsJLyogQ0w9MyBCdXJzdGxlbmd0aCA9IDQgKi8KKwkJCWlmICh0bXAgPT0gMSkgeyAvKiBjbG9ja3Mgc3luYyAqLworCQkJCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgwNTExMDA1MTsKKwkJCQllbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MjQxMTAwNTE7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMyBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJfSBlbHNlIHsJLyogY2xrIHN5bmMuIGJ5cGFzc2VkCSovCisKKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCS8qIHJlZ2lzdGVyZCBERFIgU0RSQU0/ICovCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MkMxMTA3RjI7CisJCQkJZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDNDMTEwN2QyOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNYXguIENMIGlzIDMgQ0xLcyAweDE0MWM9ICUwOGx4LCAweDE0MDQgPSAlMDhseFxuIiwKKwkJCQkgICAgIHRtcF9zZHJhbV9tb2RlLCB0bXBfZHVuaXRfY29udHJvbF9sb3cpKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEREUl9DTF8yXzU6CisJCQl0bXBfc2RyYW1fbW9kZSA9IDB4NjI7CS8qIENMPTIuNSBCdXJzdGxlbmd0aCA9IDQgKi8KKwkJCWlmICh0bXAgPT0gMSkgeyAvKiBjbG9ja3Mgc3luYyAqLworCQkJCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgyNTExMDA1MTsKKwkJCQllbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MjQxMTAwNTE7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMi41IENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9IGVsc2UgewkvKiBjbGsgc3luYy4gYnlwYXNzZWQJKi8KKworCQkJCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkgewkvKiByZWdpc3RlcmQgRERSIFNEUkFNPyAqLworCQkJCQlwcmludGYgKCJDTCA9IDIuNSwgQ2xvY2sgVW5zeW5jJ2VkLCBEdW5pdCBDb250cm9sIExvdyByZWdpc3RlciBzZXR0aW5nIHVuZGVmaW5lZFxuIik7CisJCQkJCXByaW50ZiAoIkFib3J0aW5nISEhXG4iKTsKKwkJCQkJaGFuZyAoKTsKKwkJCQl9IGVsc2UKKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgxQjExMDdkMjsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTWF4LiBDTCBpcyAyLjUgQ0xLcyAweDE0MWM9ICUwOGx4LCAweDE0MDQgPSAlMDhseFxuIiwKKwkJCQkgICAgIHRtcF9zZHJhbV9tb2RlLCB0bXBfZHVuaXRfY29udHJvbF9sb3cpKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEREUl9DTF8yOgorCQkJdG1wX3NkcmFtX21vZGUgPSAweDIyOwkvKiBDTD0yIEJ1cnN0bGVuZ3RoID0gNCAqLworCQkJaWYgKHRtcCA9PSAxKSB7IC8qIGNsb2NrcyBzeW5jICovCisJCQkJaWYgKGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKQkvKiByZWdpc3RlcmQgRERSIFNEUkFNPyAqLworCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDA0MTEwMDUxOworCQkJCWVsc2UKKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgwMzExMDA1MTsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTWF4LiBDTCBpcyAyIENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9IGVsc2UgewkvKiBjbGsgc3luYy4gYnlwYXNzZWQJKi8KKworCQkJCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkgewkvKiByZWdpc3RlcmQgRERSIFNEUkFNPyAqLworCQkJCQlwcmludGYgKCJDTCA9IDIsIENsb2NrIFVuc3luYydlZCwgRHVuaXQgQ29udHJvbCBMb3cgcmVnaXN0ZXIgc2V0dGluZyB1bmRlZmluZWRcbiIpOworCQkJCQlwcmludGYgKCJBYm9ydGluZyEhIVxuIik7CisJCQkJCWhhbmcgKCk7CisJCQkJfSBlbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4M0IxMTA3ZDI7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMiBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRERSX0NMXzFfNToKKwkJCXRtcF9zZHJhbV9tb2RlID0gMHg1MjsJLyogQ0w9MS41IEJ1cnN0bGVuZ3RoID0gNCAqLworCQkJaWYgKHRtcCA9PSAxKSB7IC8qIGNsb2NrcyBzeW5jICovCisJCQkJaWYgKGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKQkvKiByZWdpc3RlcmQgRERSIFNEUkFNPyAqLworCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDI0MTEwMDUxOworCQkJCWVsc2UKKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgyMzExMDA1MTsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTWF4LiBDTCBpcyAxLjUgQ0xLcyAweDE0MWM9ICUwOGx4LCAweDE0MDQgPSAlMDhseFxuIiwKKwkJCQkgICAgIHRtcF9zZHJhbV9tb2RlLCB0bXBfZHVuaXRfY29udHJvbF9sb3cpKTsKKwkJCX0gZWxzZSB7CS8qIGNsayBzeW5jLiBieXBhc3NlZAkqLworCisJCQkJaWYgKGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKSB7CS8qIHJlZ2lzdGVyZCBERFIgU0RSQU0/ICovCisJCQkJCXByaW50ZiAoIkNMID0gMS41LCBDbG9jayBVbnN5bmMnZWQsIER1bml0IENvbnRyb2wgTG93IHJlZ2lzdGVyIHNldHRpbmcgdW5kZWZpbmVkXG4iKTsKKwkJCQkJcHJpbnRmICgiQWJvcnRpbmchISFcbiIpOworCQkJCQloYW5nICgpOworCQkJCX0gZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDFBMTEwN2QyOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNYXguIENMIGlzIDEuNSBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZiAoIk1heC4gQ0wgaXMgb3V0IG9mIHJhbmdlICVkXG4iLAorCQkJCWluZm8tPm1heENsU3VwcG9ydGVkX0REUik7CisJCQloYW5nICgpOworCQkJYnJlYWs7CisJCX0JCS8qIGVuZCBERFIgc3dpdGNoICovCisJCWJyZWFrOworCX0JCQkvKiBlbmQgQ0wgc3dpdGNoICovCisKKwkvKiBXcml0ZSByZXN1bHRzIG9mIENMIGRldGVjdGlvbiBwcm9jZWR1cmUgKi8KKwkvKiBzZXQgU0RSQU0gbW9kZSByZWcuIDB4MTQxYyAqLworCUdUX1JFR19XUklURSAoU0RSQU1fTU9ERSwgdG1wX3NkcmFtX21vZGUpOworCisJLyogc2V0IFNEUkFNIG1vZGUgU2V0Q29tbWFuZCAweDE0MTggKi8KKwlHVF9SRUdfV1JJVEUgKFNEUkFNX09QRVJBVElPTiwgMHgzKTsKKwl3aGlsZSAoR1RSRUdSRUFEIChTRFJBTV9PUEVSQVRJT04pICE9IDApIHsKKwkJRFAgKHByaW50ZgorCQkgICAgKCJcbioqKiBTRFJBTV9PUEVSQVRJT04gMHgxNDE4IGFmdGVyIFNEUkFNX01PREU6IE1vZHVsZSBzdGlsbCBidXN5IC4uLiBwbGVhc2Ugd2FpdC4uLiAqKipcbiIpKTsKKwl9CisKKwkvKiBTRFJBTSBEX1VOSVRfQ09OVFJPTF9MT1cgMHgxNDA0ICovCisJR1RfUkVHX1dSSVRFIChEX1VOSVRfQ09OVFJPTF9MT1csIHRtcF9kdW5pdF9jb250cm9sX2xvdyk7CisKKwkvKiBzZXQgU0RSQU0gbW9kZSBTZXRDb21tYW5kIDB4MTQxOCAqLworCUdUX1JFR19XUklURSAoU0RSQU1fT1BFUkFUSU9OLCAweDMpOworCXdoaWxlIChHVFJFR1JFQUQgKFNEUkFNX09QRVJBVElPTikgIT0gMCkgeworCQlEUCAocHJpbnRmCisJCSAgICAoIlxuKioqIFNEUkFNX09QRVJBVElPTiAxNDE4IGFmdGVyIERfVU5JVF9DT05UUk9MX0xPVzogTW9kdWxlIHN0aWxsIGJ1c3kgLi4uIHBsZWFzZSB3YWl0Li4uICoqKlxuIikpOworCX0KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIGJhbmsgcGFyYW1ldGVycyAqLworCS8qIFNEUkFNIGFkZHJlc3MgZGVjb2RlIHJlZ2lzdGVyIDB4MTQxMCAqLworCS8qIHByb2dyYW0gdGhpcyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlICovCisJdG1wID0gMHgwMjsJCS8qIHBvd2VyLXVwIGRlZmF1bHQgYWRkcmVzcyBzZWxlY3QgZGVjb2RpbmcgdmFsdWUgKi8KKworCURQIChwcmludGYgKCJkcmJfc2l6ZSAobio2NE1iaXQpOiAlZFxuIiwgaW5mby0+ZHJiX3NpemUpKTsKKy8qIGZpZ3VyZSBvdXQgdGhlIERSQU0gY2hpcCBzaXplICovCisJc2RyYW1fY2hpcF9zaXplID0KKwkJKDEgPDwgKGluZm8tPm51bU9mUm93QWRkcmVzc2VzICsgaW5mby0+bnVtT2ZDb2xBZGRyZXNzZXMpKTsKKwlzZHJhbV9jaGlwX3NpemUgKj0gaW5mby0+c2RyYW1XaWR0aDsKKwlzZHJhbV9jaGlwX3NpemUgKj0gNDsKKwlEUCAocHJpbnRmICgiY29tcHV0ZWQgc2RyYW0gY2hpcCBzaXplIGlzICUjbHhcbiIsIHNkcmFtX2NoaXBfc2l6ZSkpOworCS8qIGRpdmlkZSBzZHJhbSBjaGlwIHNpemUgYnkgNjQgTWJpdHMgKi8KKwlzZHJhbV9jaGlwX3NpemUgPSBzZHJhbV9jaGlwX3NpemUgLyAweDQwMDAwMDA7CisJc3dpdGNoIChzZHJhbV9jaGlwX3NpemUpIHsKKwljYXNlIDE6CQkvKiA2NCBNYml0ICovCisJY2FzZSAyOgkJLyogMTI4IE1iaXQgKi8KKwkJRFAgKHByaW50ZiAoIlJBTS1EZXZpY2Vfc2l6ZSA2NE1iaXQgb3IgMTI4TWJpdClcbiIpKTsKKwkJdG1wIHw9ICgweDAwIDw8IDQpOworCQlicmVhazsKKwljYXNlIDQ6CQkvKiAyNTYgTWJpdCAqLworCWNhc2UgODoJCS8qIDUxMiBNYml0ICovCisJCURQIChwcmludGYgKCJSQU0tRGV2aWNlX3NpemUgMjU2TWJpdCBvciA1MTJNYml0KVxuIikpOworCQl0bXAgfD0gKDB4MDEgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgMTY6CQkvKiAxIEdiaXQgKi8KKwljYXNlIDMyOgkJLyogMiBHYml0ICovCisJCURQIChwcmludGYgKCJSQU0tRGV2aWNlX3NpemUgMUdiaXQgb3IgMkdiaXQpXG4iKSk7CisJCXRtcCB8PSAoMHgwMiA8PCA0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiRXJyb3IgaW4gZHJhbSBzaXplIGNhbGN1bGF0aW9uXG4iKTsKKwkJcHJpbnRmICgiUkFNLURldmljZV9zaXplIGlzIHVuc3VwcG9ydGVkXG4iKTsKKwkJaGFuZyAoKTsKKwl9CisKKwkvKiBTRFJBTSBhZGRyZXNzIGNvbnRyb2wgKi8KKwlHVF9SRUdfV1JJVEUgKFNEUkFNX0FERFJfQ09OVFJPTCwgdG1wKTsKKwlEUCAocHJpbnRmCisJICAgICgic2V0dGluZyB1cCBzZHJhbSBhZGRyZXNzIGNvbnRyb2wgKDB4MTQxMCkgd2l0aDogJTA4bHggXG4iLAorCSAgICAgdG1wKSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogc2FtZSBzZXR0aW5ncyBmb3IgcmVnaXN0ZXJkICYgbm9uLXJlZ2lzdGVyZCBERFIgU0RSQU0gKi8KKwlEUCAocHJpbnRmCisJICAgICgic2V0dGluZyB1cCBzZHJhbV90aW1pbmdfY29udHJvbF9sb3cgKDB4MTQwOCkgd2l0aDogJTA4eCBcbiIsCisJICAgICAweDExNTExMjIwKSk7CisJR1RfUkVHX1dSSVRFIChTRFJBTV9USU1JTkdfQ09OVFJPTF9MT1csIDB4MTE1MTEyMjApOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogU0RSQU0gY29uZmlndXJhdGlvbiAqLworCXRtcCA9IEdUUkVHUkVBRCAoU0RSQU1fQ09ORklHKTsKKworCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMKKwkgICAgfHwgaW5mby0+cmVnaXN0ZXJlZERRTUJpbnB1dHMpIHsKKwkJdG1wIHw9ICgxIDw8IDE3KTsKKwkJRFAgKHByaW50ZgorCQkgICAgKCJTUEQgc2F5czogcmVnaXN0ZXJlZCBBZGRyLiBhbmQgQ29udC46ICVkOyByZWdpc3RlcmVkIERRTUJpbnB1dHM6ICVkXG4iLAorCQkgICAgIGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cywKKwkJICAgICBpbmZvLT5yZWdpc3RlcmVkRFFNQmlucHV0cykpOworCX0KKworCS8qIFVzZSBidWZmZXIgMSB0byByZXR1cm4gcmVhZCBkYXRhIHRvIHRoZSBDUFUKKwkgKiBQYWdlIDQyNiBNVjY0MzYwICovCisJdG1wIHw9ICgxIDw8IDI2KTsKKwlEUCAocHJpbnRmCisJICAgICgiQmVmb3JlIEJ1ZmZlciBhc3NpZ25tZW50IC0gc2RyYW1fY29uZiAoMHgxNDAwKTogJTA4eFxuIiwKKwkgICAgIEdUUkVHUkVBRCAoU0RSQU1fQ09ORklHKSkpOworCURQIChwcmludGYKKwkgICAgKCJBZnRlciBCdWZmZXIgYXNzaWdubWVudCAtIHNkcmFtX2NvbmYgKDB4MTQwMCk6ICUwOHhcbiIsCisJICAgICBHVFJFR1JFQUQgKFNEUkFNX0NPTkZJRykpKTsKKworCS8qIFNEUkFNIHRpbWluZyBUb19kbzogKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJRFAgKHByaW50ZgorCSAgICAoInNldHRpbmcgdXAgc2RyYW1fdGltaW5nX2NvbnRyb2xfaGlnaCAoMHgxNDBjKSB3aXRoOiAlMDh4IFxuIiwKKwkgICAgIDB4OSkpOworCUdUX1JFR19XUklURSAoU0RSQU1fVElNSU5HX0NPTlRST0xfSElHSCwgMHg5KTsKKworCURQIChwcmludGYKKwkgICAgKCJzZXR0aW5nIHVwIHNkcmFtIGFkZHJlc3MgcGFkcyBjb250cm9sICgweDE0YzApIHdpdGg6ICUwOHggXG4iLAorCSAgICAgMHg3ZDUwMTRhKSk7CisJR1RfUkVHX1dSSVRFIChTRFJBTV9BRERSX0NUUkxfUEFEU19DQUxJQlJBVElPTiwgMHg3ZDUwMTRhKTsKKworCURQIChwcmludGYKKwkgIGluZGVudDogU3RhbmRhcmQgaW5wdXQ6MTQ1MDogV2FybmluZzpvbGQgc3R5bGUgYXNzaWdubWVudCBhbWJpZ3VpdHkgaW4gIj0qIi4JQXNzdW1pbmcgIj0gKiIKKworaW5kZW50OiBTdGFuZGFyZCBpbnB1dDoxNDUxOiBXYXJuaW5nOm9sZCBzdHlsZSBhc3NpZ25tZW50IGFtYmlndWl0eSBpbiAiPSoiLiAgQXNzdW1pbmcgIj0gKiIKKworICAoInNldHRpbmcgdXAgc2RyYW0gZGF0YSBwYWRzIGNvbnRyb2wgKDB4MTRjNCkgd2l0aDogJTA4eCBcbiIsCisJICAgICAweDdkNTAxNGEpKTsKKwlHVF9SRUdfV1JJVEUgKFNEUkFNX0RBVEFfUEFEU19DQUxJQlJBVElPTiwgMHg3ZDUwMTRhKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBzZXQgdGhlIFNEUkFNIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggYmFuayAqLworCisvKglmb3IgKGkgPSBpbmZvLT5zbG90ICogMjsgaSA8ICgoaW5mby0+c2xvdCAqIDIpICsgaW5mby0+YmFua3MpOyBpKyspICovCisJeworCQlpID0gaW5mby0+c2xvdDsKKwkJRFAgKHByaW50ZgorCQkgICAgKCJcbioqKiBSdW5uaW5nIGEgTVJTIGN5Y2xlIGZvciBiYW5rICVkICoqKlxuIiwgaSkpOworCisJCS8qIG1hcCB0aGUgYmFuayAqLworCQltZW1vcnlfbWFwX2JhbmsgKGksIDAsIEdCIC8gNCk7CisKKwkJLyogc2V0IFNEUkFNIG1vZGUgKi8gLyogVG9fZG8gY2hlY2sgaXQgKi8KKwkJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVSQVRJT04sIDB4Myk7CisJCWNoZWNrID0gR1RSRUdSRUFEIChTRFJBTV9PUEVSQVRJT04pOworCQlEUCAocHJpbnRmCisJCSAgICAoIlxuKioqIFNEUkFNX09QRVJBVElPTiAxNDE4ICgwID0gTm9ybWFsIE9wZXJhdGlvbikgPSAlMDhseCAqKipcbiIsCisJCSAgICAgY2hlY2spKTsKKworCisJCS8qIHN3aXRjaCBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLworCQlHVF9SRUdfV1JJVEUgKFNEUkFNX09QRVJBVElPTiwgMCk7CisJCWNoZWNrID0gR1RSRUdSRUFEIChTRFJBTV9PUEVSQVRJT04pOworCQlEUCAocHJpbnRmCisJCSAgICAoIlxuKioqIFNEUkFNX09QRVJBVElPTiAxNDE4ICgwID0gTm9ybWFsIE9wZXJhdGlvbikgPSAlMDhseCAqKipcbiIsCisJCSAgICAgY2hlY2spKTsKKworCQkvKiB1bm1hcCB0aGUgYmFuayAqLworCQltZW1vcnlfbWFwX2JhbmsgKGksIDAsIDApOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qCisgKiBDaGVjayBtZW1vcnkgcmFuZ2UgZm9yIHZhbGlkIFJBTS4gQSBzaW1wbGUgbWVtb3J5IHRlc3QgZGV0ZXJtaW5lcworICogdGhlIGFjdHVhbGx5IGF2YWlsYWJsZSBSQU0gc2l6ZSBiZXR3ZWVuIGFkZHJlc3NlcyBgYmFzZScgYW5kCisgKiBgYmFzZSArIG1heHNpemUnLiBTb21lIChub3QgYWxsKSBoYXJkd2FyZSBlcnJvcnMgYXJlIGRldGVjdGVkOgorICogLSBzaG9ydCBiZXR3ZWVuIGFkZHJlc3MgbGluZXMKKyAqIC0gc2hvcnQgYmV0d2VlbiBkYXRhIGxpbmVzCisgKi8KK2xvbmcgaW50IGRyYW1fc2l6ZSAobG9uZyBpbnQgKmJhc2UsIGxvbmcgaW50IG1heHNpemUpCit7CisJdm9sYXRpbGUgbG9uZyBpbnQgKmFkZHIsICpiID0gYmFzZTsKKwlsb25nIGludCBjbnQsIHZhbCwgc2F2ZTEsIHNhdmUyOworCisjZGVmaW5lIFNUQVJUVkFMICgxPDwyMCkJLyogc3RhcnQgdGVzdCBhdCAxTSAqLworCWZvciAoY250ID0gU1RBUlRWQUwgLyBzaXplb2YgKGxvbmcpOyBjbnQgPCBtYXhzaXplIC8gc2l6ZW9mIChsb25nKTsKKwkgICAgIGNudCA8PD0gMSkgeworCQlhZGRyID0gYmFzZSArIGNudDsJLyogcG9pbnRlciBhcml0aCEgKi8KKworCQlzYXZlMSA9ICphZGRyOwkvKiBzYXZlIGNvbnRlbnRzIG9mIGFkZHIgKi8KKwkJc2F2ZTIgPSAqYjsJLyogc2F2ZSBjb250ZW50cyBvZiBiYXNlICovCisKKwkJKmFkZHIgPSBjbnQ7CS8qIHdyaXRlIGNudCB0byBhZGRyICovCisJCSpiID0gMDsJCS8qIHB1dCBudWxsIGF0IGJhc2UgKi8KKworCQkvKiBjaGVjayBhdCBiYXNlIGFkZHJlc3MgKi8KKwkJaWYgKCgqYikgIT0gMCkgeworCQkJKmFkZHIgPSBzYXZlMTsJLyogcmVzdG9yZSAqYWRkciAqLworCQkJKmIgPSBzYXZlMjsJLyogcmVzdG9yZSAqYiAqLworCQkJcmV0dXJuICgwKTsKKwkJfQorCQl2YWwgPSAqYWRkcjsJLyogcmVhZCAqYWRkciAqLworCQl2YWwgPSAqYWRkcjsJLyogcmVhZCAqYWRkciAqLworCisJCSphZGRyID0gc2F2ZTE7CisJCSpiID0gc2F2ZTI7CisKKwkJaWYgKHZhbCAhPSBjbnQpIHsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkZvdW5kICUwOHggIGF0IEFkZHJlc3MgJTA4eCAoZmFpbHVyZSlcbiIsCisJCQkgICAgICh1bnNpZ25lZCBpbnQpIHZhbCwgKHVuc2lnbmVkIGludCkgYWRkcikpOworCQkJLyogZml4IGJvdW5kYXJ5IGNvbmRpdGlvbi4uIFNUQVJUVkFMIG1lYW5zIHplcm8gKi8KKwkJCWlmIChjbnQgPT0gU1RBUlRWQUwgLyBzaXplb2YgKGxvbmcpKQorCQkJCWNudCA9IDA7CisJCQlyZXR1cm4gKGNudCAqIHNpemVvZiAobG9uZykpOworCQl9CisJfQorCXJldHVybiBtYXhzaXplOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHBwY2Jvb3QgaW50ZXJmYWNlIGZ1bmN0aW9uIHRvIFNEUkFNIGluaXQgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGUKKyAqIGNvbnRyb2xsaW5nIGxvZ2ljIGhhcHBlbnMgKi8KK2xvbmcgaW50IGluaXRkcmFtIChpbnQgYm9hcmRfdHlwZSkKK3sKKwlpbnQgczAgPSAwLCBzMSA9IDA7CisJaW50IGNoZWNrYmFua1s0XSA9IHtbMCAuLi4gM10gPSAwIH07CisJdWxvbmcgcmVhbHNpemUsIHRvdGFsLCBjaGVjazsKKwlBVVhfTUVNX0RJTU1fSU5GTyBkaW1tSW5mbzE7CisJQVVYX01FTV9ESU1NX0lORk8gZGltbUluZm8yOworCWludCBuaHIsIGJhbmtfbm87CisJdWxvbmcgZGVzdCwgbWVtU3BhY2VBdHRyOworCisJLyogZmlyc3QsIHVzZSB0aGUgU1BEIHRvIGdldCBpbmZvIGFib3V0IHRoZSBTRFJBTS8gRERSUkFNICovCisKKwkvKiBjaGVjayB0aGUgTkhSIGJpdCBhbmQgc2tpcCBtZW0gaW5pdCBpZiBpdCdzIGFscmVhZHkgZG9uZSAqLworCW5ociA9IGdldF9oaWQwICgpICYgKDEgPDwgMTYpOworCisJaWYgKG5ocikgeworCQlwcmludGYgKCJTa2lwcGluZyBTRC0gRERSUkFNIHNldHVwIGR1ZSB0byBOSFIgYml0IGJlaW5nIHNldFxuIik7CisJfSBlbHNlIHsKKwkJLyogRElNTTAgKi8KKwkJczAgPSBjaGVja19kaW1tICgwLCAmZGltbUluZm8xKTsKKworCQkvKiBESU1NMSAqLworCQlzMSA9IGNoZWNrX2RpbW0gKDEsICZkaW1tSW5mbzIpOworCisJCW1lbW9yeV9tYXBfYmFuayAoMCwgMCwgMCk7CisJCW1lbW9yeV9tYXBfYmFuayAoMSwgMCwgMCk7CisJCW1lbW9yeV9tYXBfYmFuayAoMiwgMCwgMCk7CisJCW1lbW9yeV9tYXBfYmFuayAoMywgMCwgMCk7CisKKwkJLyogcm9uZW4gY2hlY2sgY29ycmVjdCBzZXQgb2YgRElNTVMgKi8KKwkJaWYgKGRpbW1JbmZvMS5udW1PZk1vZHVsZUJhbmtzICYmIGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzKSB7CisJCQlpZiAoZGltbUluZm8xLmVycm9yQ2hlY2tUeXBlICE9CisJCQkgICAgZGltbUluZm8yLmVycm9yQ2hlY2tUeXBlKQorCQkJCXByaW50ZiAoIioqKldBUk5OSU5HKioqISEhISBkaWZmZXJlbnQgRUNDIHN1cHBvcnQgb2YgdGhlIERJTU1TXG4iKTsKKwkJCWlmIChkaW1tSW5mbzEubWF4Q2xTdXBwb3J0ZWRfRERSICE9CisJCQkgICAgZGltbUluZm8yLm1heENsU3VwcG9ydGVkX0REUikKKwkJCQlwcmludGYgKCIqKipXQVJOTklORyoqKiEhISEgZGlmZmVyZW50IENBTCBzZXR0aW5nIG9mIHRoZSBESU1NU1xuIik7CisJCQlpZiAoZGltbUluZm8xLnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyAhPQorCQkJICAgIGRpbW1JbmZvMi5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMpCisJCQkJcHJpbnRmICgiKioqV0FSTk5JTkcqKiohISEhIGRpZmZlcmVudCBSZWdpc3RyYXRpb24gc2V0dGluZyBvZiB0aGUgRElNTVNcbiIpOworCQl9CisKKwkJaWYgKGRpbW1JbmZvMS5udW1PZk1vZHVsZUJhbmtzICYmIHNldHVwX3NkcmFtICgmZGltbUluZm8xKSkgeworCQkJcHJpbnRmICgiU2V0dXAgZm9yIERJTU0xIGZhaWxlZC5cbiIpOworCQl9CisKKwkJaWYgKGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzICYmIHNldHVwX3NkcmFtICgmZGltbUluZm8yKSkgeworCQkJcHJpbnRmICgiU2V0dXAgZm9yIERJTU0yIGZhaWxlZC5cbiIpOworCQl9CisKKwkJLyogc2V0IHRoZSBOSFIgYml0ICovCisJCXNldF9oaWQwIChnZXRfaGlkMCAoKSB8ICgxIDw8IDE2KSk7CisJfQorCS8qIG5leHQsIHNpemUgdGhlIFNEUkFNIGJhbmtzICovCisKKwlyZWFsc2l6ZSA9IHRvdGFsID0gMDsKKwljaGVjayA9IEdCIC8gNDsKKwlpZiAoZGltbUluZm8xLm51bU9mTW9kdWxlQmFua3MgPiAwKSB7CisJCWNoZWNrYmFua1swXSA9IDE7CisJfQorCWlmIChkaW1tSW5mbzEubnVtT2ZNb2R1bGVCYW5rcyA+IDEpIHsKKwkJY2hlY2tiYW5rWzFdID0gMTsKKwl9CisJaWYgKGRpbW1JbmZvMS5udW1PZk1vZHVsZUJhbmtzID4gMikKKwkJcHJpbnRmICgiRXJyb3IsIFNQRCBjbGFpbXMgRElNTTEgaGFzID4yIGJhbmtzXG4iKTsKKworCXByaW50ZiAoIi0tIERJTU0xIGhhcyAlZCBiYW5rc1xuIiwgZGltbUluZm8xLm51bU9mTW9kdWxlQmFua3MpOworCisJaWYgKGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzID4gMCkgeworCQljaGVja2JhbmtbMl0gPSAxOworCX0KKwlpZiAoZGltbUluZm8yLm51bU9mTW9kdWxlQmFua3MgPiAxKSB7CisJCWNoZWNrYmFua1szXSA9IDE7CisJfQorCWlmIChkaW1tSW5mbzIubnVtT2ZNb2R1bGVCYW5rcyA+IDIpCisJCXByaW50ZiAoIkVycm9yLCBTUEQgY2xhaW1zIERJTU0yIGhhcyA+MiBiYW5rc1xuIik7CisKKwlwcmludGYgKCItLSBESU1NMiBoYXMgJWQgYmFua3NcbiIsIGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzKTsKKworCWZvciAoYmFua19ubyA9IDA7IGJhbmtfbm8gPCBDRkdfRFJBTV9CQU5LUzsgYmFua19ubysrKSB7CisJCS8qIHNraXAgb3ZlciBiYW5rcyB0aGF0IGFyZSBub3QgcG9wdWxhdGVkICovCisJCWlmICghY2hlY2tiYW5rW2Jhbmtfbm9dKQorCQkJY29udGludWU7CisKKwkJLyogcm9uZW4gLSByZWFsc2l6ZSA9IGRyYW1fc2l6ZSgobG9uZyBpbnQgKil0b3RhbCwgY2hlY2spOyAqLworCQlpZiAoYmFua19ubyA9PSAwIHx8IGJhbmtfbm8gPT0gMSkgeworCQkJaWYgKGNoZWNrYmFua1sxXSA9PSAxKQorCQkJCXJlYWxzaXplID0gZGltbUluZm8xLnNpemUgLyAyOworCQkJZWxzZQorCQkJCXJlYWxzaXplID0gZGltbUluZm8xLnNpemU7CisJCX0KKwkJaWYgKGJhbmtfbm8gPT0gMiB8fCBiYW5rX25vID09IDMpIHsKKwkJCWlmIChjaGVja2JhbmtbM10gPT0gMSkKKwkJCQlyZWFsc2l6ZSA9IGRpbW1JbmZvMi5zaXplIC8gMjsKKwkJCWVsc2UKKwkJCQlyZWFsc2l6ZSA9IGRpbW1JbmZvMi5zaXplOworCQl9CisJCW1lbW9yeV9tYXBfYmFuayAoYmFua19ubywgdG90YWwsIHJlYWxzaXplKTsKKworCQkvKiByb25lbiAtIGluaXRpYWxpemUgdGhlIERSQU0gZm9yIEVDQyAqLworI2lmZGVmIENPTkZJR19NVjY0MzYwX0VDQworCQlpZiAoKGRpbW1JbmZvMS5lcnJvckNoZWNrVHlwZSAhPSAwKSAmJgorCQkgICAgKChkaW1tSW5mbzIuZXJyb3JDaGVja1R5cGUgIT0gMCkKKwkJICAgICB8fCAoZGltbUluZm8yLm51bU9mTW9kdWxlQmFua3MgPT0gMCkpKSB7CisJCQlwcmludGYgKCJFQ0MgSW5pdGlhbGl6YXRpb24gb2YgQmFuayAlZDoiLCBiYW5rX25vKTsKKwkJCW1lbVNwYWNlQXR0ciA9ICgofihCSVQwIDw8IGJhbmtfbm8pKSAmIDB4ZikgPDwgODsKKwkJCW12RG1hU2V0TWVtb3J5U3BhY2UgKDAsIDAsIG1lbVNwYWNlQXR0ciwgdG90YWwsCisJCQkJCSAgICAgcmVhbHNpemUpOworCQkJZm9yIChkZXN0ID0gdG90YWw7IGRlc3QgPCB0b3RhbCArIHJlYWxzaXplOworCQkJICAgICBkZXN0ICs9IF84TSkgeworCQkJCW12RG1hVHJhbnNmZXIgKDAsIHRvdGFsLCBkZXN0LCBfOE0sCisJCQkJCSAgICAgICBCSVQ4IC8qRE1BX0RUTF8xMjhCWVRFUyAqLyAgfAorCQkJCQkgICAgICAgQklUMyAvKkRNQV9IT0xEX1NPVVJDRV9BRERSICovCisJCQkJCSAgICAgICB8CisJCQkJCSAgICAgICBCSVQxMQorCQkJCQkgICAgICAgLypETUFfQkxPQ0tfVFJBTlNGRVJfTU9ERSAqLyApOworCQkJCXdoaWxlIChtdkRtYUlzQ2hhbm5lbEFjdGl2ZSAoMCkpOworCQkJfQorCQkJcHJpbnRmICgiIFBBU1NcbiIpOworCQl9CisjZW5kaWYKKworCQl0b3RhbCArPSByZWFsc2l6ZTsKKwl9CisKKwkvKiByb25lbi0gYWRkIERSQU0gY29uZiBwcmludHMgKi8KKwlzd2l0Y2ggKChHVFJFR1JFQUQgKDB4MTQxYykgPj4gNCkgJiAweDcpIHsKKwljYXNlIDB4MjoKKwkJcHJpbnRmICgiQ0FTIExhdGVuY3kgPSAyIik7CisJCWJyZWFrOworCWNhc2UgMHgzOgorCQlwcmludGYgKCJDQVMgTGF0ZW5jeSA9IDMiKTsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJCXByaW50ZiAoIkNBUyBMYXRlbmN5ID0gMS41Iik7CisJCWJyZWFrOworCWNhc2UgMHg2OgorCQlwcmludGYgKCJDQVMgTGF0ZW5jeSA9IDIuNSIpOworCQlicmVhazsKKwl9CisJcHJpbnRmICgiIHRSUCA9ICVkIHRSQVMgPSAlZCB0UkNEPSVkXG4iLAorCQkoKEdUUkVHUkVBRCAoMHgxNDA4KSA+PiA4KSAmIDB4ZikgKyAxLAorCQkoKEdUUkVHUkVBRCAoMHgxNDA4KSA+PiAyMCkgJiAweGYpICsgMSwKKwkJKChHVFJFR1JFQUQgKDB4MTQwOCkgPj4gNCkgJiAweGYpICsgMSk7CisKKy8qCVNldHVwIEV0aGVybmV0IERNQSBBZHJlc3Mgd2luZG93IHRvIERSQU0gQXJlYSAqLworCWlmICh0b3RhbCA+IF8yNTZNKQorCQlwcmludGYgKCIqKiogT05MWSB0aGUgZmlyc3QgMjU2TUIgRFJBTSBtZW1vcnkgYXJlIHVzZWQgb3V0IG9mIHRoZSAiKTsKKwllbHNlCisJCXByaW50ZiAoIlRvdGFsIFNEUkFNIG1lbW9yeSBpcyAiKTsKKwkvKiAoY2F1c2UgYWxsIHRoZSA0IEJBVFMgYXJlIHRha2VuKSAqLworCXJldHVybiAodG90YWwpOworfQorCisKKy8qIHJvbmVuLSBhZGQgSWRtYSBmdW5jdGlvbnMgZm9yIHVzYWdlIG9mIHRoZSBlY2MgZHJhbSBpbml0LiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZEbWFJc0NoYW5uZWxBY3RpdmUgLSBDaGVja3MgaWYgYSBlbmdpbmUgaXMgYnVzeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG12RG1hSXNDaGFubmVsQWN0aXZlIChpbnQgZW5naW5lKQoreworCXVsb25nIGRhdGE7CisKKwlkYXRhID0gR1RSRUdSRUFEIChNVjY0MzYwX0RNQV9DSEFOTkVMMF9DT05UUk9MICsgNCAqIGVuZ2luZSk7CisJaWYgKGRhdGEgJiBCSVQxNCAvKmFjdGl2aXR5IHN0YXR1cyAqLyApIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkRtYVNldE1lbW9yeVNwYWNlIC0gU2V0IGEgRE1BIG1lbW9yeSB3aW5kb3cgZm9yIHRoZSBETUEncyBhZGRyZXNzIGRlY29kaW5nCisqCQkJbWFwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtdkRtYVNldE1lbW9yeVNwYWNlICh1bG9uZyBtZW1TcGFjZSwKKwkJCSB1bG9uZyBtZW1TcGFjZVRhcmdldCwKKwkJCSB1bG9uZyBtZW1TcGFjZUF0dHIsIHVsb25nIGJhc2VBZGRyZXNzLCB1bG9uZyBzaXplKQoreworCXVsb25nIHRlbXA7CisKKwkvKiBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4gICovCisJaWYgKGJhc2VBZGRyZXNzICUgc2l6ZSAhPSAwKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2l6ZSA+PSAweDEwMDAwIC8qNjRLICovICkgeworCQlzaXplICY9IDB4ZmZmZjAwMDA7CisJCWJhc2VBZGRyZXNzID0gKGJhc2VBZGRyZXNzICYgMHhmZmZmMDAwMCk7CisJCS8qIFNldCB0aGUgbmV3IGF0dHJpYnV0ZXMgKi8KKwkJR1RfUkVHX1dSSVRFIChNVjY0MzYwX0RNQV9CQVNFX0FERFJfUkVHMCArIG1lbVNwYWNlICogOCwKKwkJCSAgICAgIChiYXNlQWRkcmVzcyB8IG1lbVNwYWNlVGFyZ2V0IHwgbWVtU3BhY2VBdHRyKSk7CisJCUdUX1JFR19XUklURSAoKE1WNjQzNjBfRE1BX1NJWkVfUkVHMCArIG1lbVNwYWNlICogOCksCisJCQkgICAgICAoc2l6ZSAtIDEpICYgMHhmZmZmMDAwMCk7CisJCXRlbXAgPSBHVFJFR1JFQUQgKE1WNjQzNjBfRE1BX0JBU0VfQUREUl9FTkFCTEVfUkVHKTsKKwkJR1RfUkVHX1dSSVRFIChETUFfQkFTRV9BRERSX0VOQUJMRV9SRUcsCisJCQkgICAgICAodGVtcCAmIH4oQklUMCA8PCBtZW1TcGFjZSkpKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RG1hVHJhbnNmZXIgLSBUcmFuc2ZlciBkYXRhIGZyb20gc291cmNlQWRkciB0byBkZXN0QWRkciBvbiBvbmUgb2YgdGhlIDQKKyoJCSAgRE1BIGNoYW5uZWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbXZEbWFUcmFuc2ZlciAoaW50IGVuZ2luZSwgdWxvbmcgc291cmNlQWRkciwKKwkJICAgdWxvbmcgZGVzdEFkZHIsIHVsb25nIG51bU9mQnl0ZXMsIHVsb25nIGNvbW1hbmQpCit7CisJdWxvbmcgZW5nT2ZmUmVnID0gMDsJLyogRW5naW5lIE9mZnNldCBSZWdpc3RlciAqLworCisJaWYgKG51bU9mQnl0ZXMgPiAweGZmZmYpIHsKKwkJY29tbWFuZCA9IGNvbW1hbmQgfCBCSVQzMSAvKkRNQV8xNk1fREVTQ1JJUFRPUl9NT0RFICovIDsKKwl9CisJY29tbWFuZCA9IGNvbW1hbmQgfCAoKGNvbW1hbmQgPj4gNikgJiAweDcpOworCWVuZ09mZlJlZyA9IGVuZ2luZSAqIDQ7CisJR1RfUkVHX1dSSVRFIChNVjY0MzYwX0RNQV9DSEFOTkVMMF9CWVRFX0NPVU5UICsgZW5nT2ZmUmVnLAorCQkgICAgICBudW1PZkJ5dGVzKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQzNjBfRE1BX0NIQU5ORUwwX1NPVVJDRV9BRERSICsgZW5nT2ZmUmVnLAorCQkgICAgICBzb3VyY2VBZGRyKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQzNjBfRE1BX0NIQU5ORUwwX0RFU1RJTkFUSU9OX0FERFIgKyBlbmdPZmZSZWcsCisJCSAgICAgIGRlc3RBZGRyKTsKKwljb21tYW5kID0KKwkJY29tbWFuZCB8IEJJVDEyIC8qRE1BX0NIQU5ORUxfRU5BQkxFICovCSB8IEJJVDkKKwkJLypETUFfTk9OX0NIQUlOX01PREUgKi8gOworCS8qIEFjdGl2YXRlIERNQSBlbmdpbmUgQnkgd3JpdHRpbmcgdG8gbXZEbWFDb250cm9sUmVnaXN0ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKE1WNjQzNjBfRE1BX0NIQU5ORUwwX0NPTlRST0wgKyBlbmdPZmZSZWcsIGNvbW1hbmQpOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJU0RSQU0gSU5JVAkJCQkJCSoKKyAqICBUaGlzIHByb2NlZHVyZSBkZXRlY3QgYWxsIFNkcmFtIHR5cGVzOiA2NCwgMTI4LCAyNTYsIDUxMiBNYml0LCAxR2JpdCBhbmQgMkdiCSoKKyAqCQkgIFRoaXMgcHJvY2VkdXJlIGZpdHMgb25seSB0aGUgQXRsYW50aXMJCQkJCSoKKyAqCQkJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlERkNETCBpbml0aWFsaXplIE1WNjQzeHggRGVzaWduIENvbnNpZGVyYXRpb25zCQkqCisgKgkJCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzZXRfZGZjZGxJbml0ICh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkZmNkbF93b3JkID0gMHgzOTE7CS8qICAgMHgxNGY7ICByb25lbiBuZXcgZGZjZGwgKi8KKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCUdUX1JFR19XUklURSAoU1JBTV9EQVRBMCwgZGZjZGxfd29yZCk7CisvKglkZmNkbF93b3JkICs9IDB4NDE7ICAtIHJvbmVuIG5ldyBkZmNkbCAqLworCX0KKwlHVF9SRUdfV1JJVEUgKERGQ0RMX0NPTkZJRzAsIDB4MDAzMDAwMDApOwkvKiBlbmFibGUgZHluYW1pYyBkZWxheSBsaW5lIHVwZGF0aW5nICovCisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0MzYwL3UtYm9vdC5sZHMgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQzNjAvdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0MzYwL3UtYm9vdC5sZHMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiB1LWJvb3QubGRzIC0gbGlua2VyIHNjcmlwdCBmb3IgVS1Cb290IG9uIHRoZSBHYWxpbGVvIEV2YWwgQm9hcmQuCisgKi8KKworT1VUUFVUX0FSQ0gocG93ZXJwYykKK1NFQVJDSF9ESVIoL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9saWIpOyBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL3Bvd2VycGMtYW55LWVsZi9saWIpOworLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KKyAgIF9fRFlOQU1JQyA9IDA7ICAgICovCitTRUNUSU9OUworeworICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KKyAgLiA9ICsgU0laRU9GX0hFQURFUlM7CisgIC5pbnRlcnAgOiB7ICooLmludGVycCkgfQorICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX0KKyAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX0KKyAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX0KKyAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfQorICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfQorICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9CisgIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfQorICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9CisgIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfQorICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9CisgIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX0KKyAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX0KKyAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfQorICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfQorICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX0KKyAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfQorICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX0KKyAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfQorICAuaW5pdCAgICAgICAgICA6IHsgKiguaW5pdCkJfQorICAucGx0IDogeyAqKC5wbHQpIH0KKyAgLnRleHQgICAgICA6CisgIHsKKyAgICBjcHUvNzR4eF83eHgvc3RhcnQubwkoLnRleHQpCisKKy8qIHN0b3JlIHRoZSBlbnZpcm9ubWVudCBpbiBhIHNlcGVyYXRlIHNlY3RvciBpbiB0aGUgYm9vdCBmbGFzaCAqLworLyogICAgLiA9IGVudl9vZmZzZXQ7ICovCisvKiAgICBjb21tb24vZW52aXJvbm1lbnQubygudGV4dCkgKi8KKworICAgICooLnRleHQpCisgICAgKiguZml4dXApCisgICAgKiguZ290MSkKKyAgfQorICBfZXRleHQgPSAuOworICBQUk9WSURFIChldGV4dCA9IC4pOworICAucm9kYXRhICAgIDoKKyAgeworICAgICooLnJvZGF0YSkKKyAgICAqKC5yb2RhdGExKQorICAgICooLnJvZGF0YS5zdHIxLjQpCisgIH0KKyAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MAorICAuY3RvcnMgICAgIDogeyAqKC5jdG9ycykgICB9CisgIC5kdG9ycyAgICAgOiB7ICooLmR0b3JzKSAgIH0KKworICAvKiBSZWFkLXdyaXRlIHNlY3Rpb24sIG1lcmdlZCBpbnRvIGRhdGEgc2VnbWVudDogKi8KKyAgLiA9ICguICsgMHgwMEZGKSAmIDB4RkZGRkZGMDA7CisgIF9lcm90ZXh0ID0gLjsKKyAgUFJPVklERSAoZXJvdGV4dCA9IC4pOworICAucmVsb2MgICA6CisgIHsKKyAgICAqKC5nb3QpCisgICAgX0dPVDJfVEFCTEVfID0gLjsKKyAgICAqKC5nb3QyKQorICAgIF9GSVhVUF9UQUJMRV8gPSAuOworICAgICooLmZpeHVwKQorICB9CisgIF9fZ290Ml9lbnRyaWVzID0gKF9GSVhVUF9UQUJMRV8gLSBfR09UMl9UQUJMRV8pID4+MjsKKyAgX19maXh1cF9lbnRyaWVzID0gKC4gLSBfRklYVVBfVEFCTEVfKT4+MjsKKworICAuZGF0YSAgICA6CisgIHsKKyAgICAqKC5kYXRhKQorICAgICooLmRhdGExKQorICAgICooLnNkYXRhKQorICAgICooLnNkYXRhMikKKyAgICAqKC5keW5hbWljKQorICAgIENPTlNUUlVDVE9SUworICB9CisgIF9lZGF0YSAgPSAgLjsKKyAgUFJPVklERSAoZWRhdGEgPSAuKTsKKworICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOworICAudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQorICBfX3VfYm9vdF9jbWRfZW5kID0gLjsKKworCisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9iZWdpbiA9IC47CisgIC50ZXh0LmluaXQgOiB7ICooLnRleHQuaW5pdCkgfQorICAuZGF0YS5pbml0IDogeyAqKC5kYXRhLmluaXQpIH0KKyAgLiA9IEFMSUdOKDI1Nik7CisgIF9faW5pdF9lbmQgPSAuOworCisgIF9fYnNzX3N0YXJ0ID0gLjsKKyAgLmJzcyAgICAgICA6CisgIHsKKyAgICooLnNic3MpICooLnNjb21tb24pCisgICAqKC5keW5ic3MpCisgICAqKC5ic3MpCisgICAqKENPTU1PTikKKyAgfQorICBfZW5kID0gLiA7CisgIFBST1ZJREUgKGVuZCA9IC4pOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0NDYwLzY0NDYwLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvNjQ0NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIwZWJmCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwLzY0NDYwLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBtYWluIGJvYXJkIHN1cHBvcnQvaW5pdCBmb3IgdGhlIEdhbGlsZW8gRXZhbCBib2FyZCBEQjY0NDYwLgorICovCisKKyNpZm5kZWYgX182NDQ2MF9IX18KKyNkZWZpbmUgX182NDQ2MF9IX18KKworLyogQ1BVIENvbmZpZ3VyYXRpb24gYml0cyAqLworI2RlZmluZSBDUFVfQ09ORl9BRERSX01JU1NfRU4JKDEgPDwgOCkKKyNkZWZpbmUJQ1BVX0NPTkZfU0lOR0xFX0NQVQkoMSA8PCAxMSkKKyNkZWZpbmUJQ1BVX0NPTkZfRU5ESUFORVNTCSgxIDw8IDEyKQorI2RlZmluZSBDUFVfQ09ORl9QSVBFTElORQkoMSA8PCAxMykKKyNkZWZpbmUgQ1BVX0NPTkZfU1RPUF9SRVRSWQkoMSA8PCAxNykKKyNkZWZpbmUgQ1BVX0NPTkZfTVVMVElfREVDT0RFCSgxIDw8IDE4KQorI2RlZmluZSBDUFVfQ09ORl9EUF9WQUxJRAkoMSA8PCAxOSkKKyNkZWZpbmUgQ1BVX0NPTkZfUEVSUl9QUk9QCSgxIDw8IDIyKQorI2RlZmluZSBDUFVfQ09ORl9BQUNLX0RFTEFZXzIJKDEgPDwgMjUpCisjZGVmaW5lIENQVV9DT05GX0FQX1ZBTElECSgxIDw8IDI2KQorI2RlZmluZSBDUFVfQ09ORl9SRU1BUF9XUl9ESVMJKDEgPDwgMjcpCisKKy8qIENQVSBNYXN0ZXIgQ29udHJvbCBiaXRzICovCisjZGVmaW5lIENQVV9NQVNUX0NUTF9BUkJfRU4JKDEgPDwgOCkKKyNkZWZpbmUgQ1BVX01BU1RfQ1RMX01BU0tfQlJfMQkoMSA8PCA5KQorI2RlZmluZSBDUFVfTUFTVF9DVExfTV9XUl9UUklHCSgxIDw8IDEwKQorI2RlZmluZSBDUFVfTUFTVF9DVExfTV9SRF9UUklHCSgxIDw8IDExKQorI2RlZmluZSBDUFVfTUFTVF9DVExfQ0xFQU5fQkxLCSgxIDw8IDEyKQorI2RlZmluZSBDUFVfTUFTVF9DVExfRkxVU0hfQkxLCSgxIDw8IDEzKQorCisjZW5kaWYgLyogX182NDQ2MF9IX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9NYWtlZmlsZSBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhjY2RkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxCisjIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gbGliJChCT0FSRCkuYQorCitTT0JKUwk9IC4uL2NvbW1vbi9taXNjLm8KKworT0JKUwk9ICQoQk9BUkQpLm8gLi4vY29tbW9uL2ZsYXNoLm8gLi4vY29tbW9uL3NlcmlhbC5vIC4uL2NvbW1vbi9tZW1vcnkubyBwY2kubyBcCisJICBtdl9ldGgubyAuLi9jb21tb24vbnMxNjU1MC5vIG1wc2MubyAuLi9jb21tb24vaTJjLm8gXAorCSAgc2RyYW1faW5pdC5vIC4uL2NvbW1vbi9pbnRlbF9mbGFzaC5vCisKKyQoTElCKToJLmRlcGVuZCAkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICQoT0JKUykgJChTT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ0ZMQUdTKSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpID4gJEAKKworc2luY2x1ZGUgLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvY29uZmlnLm1rIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQzNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL2NvbmZpZy5tawpAQCAtMCwwICsxLDI4IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMQorIyBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIworIyBFVkI2NDQ2MCBib2FyZHMKKyMKKworVEVYVF9CQVNFID0gMHhmZmYwMDAwMApkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0NDYwL2RiNjQ0NjAuYyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9kYjY0NDYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyZGM0NwotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9kYjY0NDYwLmMKQEAgLTAsMCArMSw5MzYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIG1vZGlmaWNhdGlvbnMgZm9yIHRoZSBEQjY0NDYwIGV2YWwgYm9hcmQgYmFzZWQgYnkgSW5nby5Bc3NtdXNAa2V5bWlsZS5jb20KKyAqLworCisvKgorICogZGI2NDQ2MC5jIC0gbWFpbiBib2FyZCBzdXBwb3J0L2luaXQgZm9yIHRoZSBHYWxpbGVvIEV2YWwgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPDc0eHhfN3h4Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tZW1vcnkuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL3BjaS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorI2luY2x1ZGUgPG5ldC5oPgorCisjaW5jbHVkZSAiZXRoLmgiCisjaW5jbHVkZSAibXBzYy5oIgorI2luY2x1ZGUgImkyYy5oIgorI2luY2x1ZGUgIjY0NDYwLmgiCisjaW5jbHVkZSAibXZfcmVncy5oIgorCisjdW5kZWYJREVCVUcKKy8qI2RlZmluZQlERUJVRyAqLworCisjZGVmaW5lCU1BUF9QQ0kKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQKHgpIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZmx1c2hfZGF0YV9jYWNoZSAodm9pZCk7CitleHRlcm4gdm9pZCBpbnZhbGlkYXRlX2wxX2luc3RydWN0aW9uX2NhY2hlICh2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0aGlzIGlzIHRoZSBjdXJyZW50IEdUIHJlZ2lzdGVyIHNwYWNlIGxvY2F0aW9uICovCisvKiBpdCBzdGFydHMgYXQgQ0ZHX0RGTF9HVF9SRUdTIGJ1dCBtb3ZlcyBsYXRlciB0byBDRkdfR1RfUkVHUyAqLworCisvKiBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW50IGNoYW5nZSBpdCB3aGlsZSB3ZSBhcmUgaW4gZmxhc2gsIHNvIHdlIGluaXRpYWxpemUgaXQKKyAqIHRvIHRoZSAiZmluYWwiIHZhbHVlLiBUaGlzIG1lYW5zIHRoYXQgYW55IGRlYnVnX2xlZCBjYWxscyBiZWZvcmUKKyAqIGJvYXJkX3ByZV9pbml0IHdvbnQgd29yayByaWdodCAobGlrZSBpbiBjcHVfaW5pdF9mKS4KKyAqIFNlZSBhbHNvIG15X3JlbWFwX2d0X3JlZ3MgYmVsb3cuIChOVEwpCisgKi8KKwordm9pZCBib2FyZF9wcmVib290bV9pbml0ICh2b2lkKTsKK3Vuc2lnbmVkIGludCBJTlRFUk5BTF9SRUdfQkFTRV9BRERSID0gQ0ZHX0dUX1JFR1M7CitpbnQgZGlzcGxheV9tZW1fbWFwICh2b2lkKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGhpcyBpcyBhIHZlcnNpb24gb2YgdGhlIEdUIHJlZ2lzdGVyIHNwYWNlIHJlbWFwcGluZyBmdW5jdGlvbiB0aGF0CisgKiBkb2Vzbid0IHRvdWNoIGdsb2JhbHMgKG1lYW5pbmcsIGl0J3Mgb2sgdG8gcnVuIGZyb20gZmxhc2guKQorICoKKyAqIFVuZm9ydHVuYXRlbHksIHRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IGEgd3JpdGFibGUKKyAqIElOVEVSTkFMX1JFR19CQVNFX0FERFIgaXMgaW1wb3NzaWJsZS4gT2ggd2VsbC4KKyAqLworCit2b2lkIG15X3JlbWFwX2d0X3JlZ3MgKHUzMiBjdXJfbG9jLCB1MzIgbmV3X2xvYykKK3sKKwl1MzIgdGVtcDsKKworCS8qIGNoZWNrIGFuZCBzZWUgaWYgaXQncyBhbHJlYWR5IG1vdmVkICovCisKKy8qIG9yaWdpbmFsIHBwY2Jvb3QgMS4xLjYgc291cmNlCisKKwl0ZW1wID0gaW5fbGUzMigodTMyICopKG5ld19sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKTsKKwlpZiAoKHRlbXAgJiAweGZmZmYpID09IG5ld19sb2MgPj4gMjApCisJCXJldHVybjsKKworCXRlbXAgPSAoaW5fbGUzMigodTMyICopKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMjApOworCisJb3V0X2xlMzIoKHUzMiAqKShjdXJfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSwgdGVtcCk7CisKKwl3aGlsZSAoR1RSRUdSRUFEKElOVEVSTkFMX1NQQUNFX0RFQ09ERSkgIT0gdGVtcCk7CitvcmlnaW5hbCBwcGNib290IDEuMS42IHNvdXJjZSBlbmQgKi8KKworCXRlbXAgPSBpbl9sZTMyICgodTMyICopIChuZXdfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSk7CisJaWYgKCh0ZW1wICYgMHhmZmZmKSA9PSBuZXdfbG9jID4+IDE2KQorCQlyZXR1cm47CisKKwl0ZW1wID0gKGluX2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMTYpOworCisJb3V0X2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpLCB0ZW1wKTsKKworCXdoaWxlIChHVFJFR1JFQUQgKElOVEVSTkFMX1NQQUNFX0RFQ09ERSkgIT0gdGVtcCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCisKK3N0YXRpYyB2b2lkIGd0X3BjaV9jb25maWcgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHN0YXQ7CisJdW5zaWduZWQgaW50IHZhbCA9IDB4MDBmZmY4NjQ7CS8qIERJTkszMjogQnVzTnVtIDIzOjE2LCAgRGV2TnVtIDE1OjExLCBGdW5jTnVtIDEwOjgsIFJlZ051bSA3OjIgKi8KKworCS8qIEluIFBDSVggbW9kZSBkZXZpY2VzIHByb3ZpZGUgdGhlaXIgb3duIGJ1cyBhbmQgZGV2aWNlIG51bWJlcnMuIFdlIHF1ZXJ5IHRoZSBEaXNjb3ZlcnkgSUkncworCSAqIGNvbmZpZyByZWdpc3RlcnMgYnkgd3JpdGluZyBvbmVzIHRvIHRoZSBidXMgYW5kIGRldmljZS4KKwkgKiBXZSB0aGVuIHVwZGF0ZSB0aGUgVmlydHVhbCByZWdpc3RlciB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVzIGFuZCBkZXZpY2UuCisJICovCisJaWYgKChHVFJFR1JFQUQgKFBDSV8wX01PREUpICYgKEJJVDQgfCBCSVQ1KSkgIT0gMCkgewkvKmlmICBQQ0ktWCAqLworCQlHVF9SRUdfV1JJVEUgKFBDSV8wX0NPTkZJR19BRERSLCBCSVQzMSB8IHZhbCk7CisKKwkJR1RfUkVHX1JFQUQgKFBDSV8wX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHLCAmc3RhdCk7CisKKwkJR1RfUkVHX1dSSVRFIChQQ0lfMF9DT05GSUdfQUREUiwgQklUMzEgfCB2YWwpOworCQlHVF9SRUdfV1JJVEUgKFBDSV8wX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHLAorCQkJICAgICAgKHN0YXQgJiAweGZmZmYwMDAwKSB8IENGR19QQ0lfSURTRUwpOworCisJfQorCWlmICgoR1RSRUdSRUFEIChQQ0lfMV9NT0RFKSAmIChCSVQ0IHwgQklUNSkpICE9IDApIHsJLyppZiAgUENJLVggKi8KKwkJR1RfUkVHX1dSSVRFIChQQ0lfMV9DT05GSUdfQUREUiwgQklUMzEgfCB2YWwpOworCQlHVF9SRUdfUkVBRCAoUENJXzFfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcsICZzdGF0KTsKKworCQlHVF9SRUdfV1JJVEUgKFBDSV8xX0NPTkZJR19BRERSLCBCSVQzMSB8IHZhbCk7CisJCUdUX1JFR19XUklURSAoUENJXzFfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcsCisJCQkgICAgICAoc3RhdCAmIDB4ZmZmZjAwMDApIHwgQ0ZHX1BDSV9JRFNFTCk7CisJfQorCisJLyogRW5hYmxlIG1hc3RlciAqLworCVBDSV9NQVNURVJfRU5BQkxFICgwLCBTRUxGKTsKKwlQQ0lfTUFTVEVSX0VOQUJMRSAoMSwgU0VMRik7CisKKwkvKiBFbmFibGUgUENJMC8xIE1lbTAgYW5kIElPIDAgZGlzYWJsZSBhbGwgb3RoZXJzICovCisJR1RfUkVHX1JFQUQgKEJBU0VfQUREUl9FTkFCTEUsICZzdGF0KTsKKwlzdGF0IHw9ICgxIDw8IDExKSB8ICgxIDw8IDEyKSB8ICgxIDw8IDEzKSB8ICgxIDw8IDE2KSB8ICgxIDw8IDE3KSB8ICgxCisJCQkJCQkJCQkgICAgIDw8CisJCQkJCQkJCQkgICAgIDE4KTsKKwlzdGF0ICY9IH4oKDEgPDwgOSkgfCAoMSA8PCAxMCkgfCAoMSA8PCAxNCkgfCAoMSA8PCAxNSkpOworCUdUX1JFR19XUklURSAoQkFTRV9BRERSX0VOQUJMRSwgc3RhdCk7CisKKwkvKiByb25lbi0gYWRkIHdyaXRlIHRvIHBjaSByZW1hcCByZWdpc3RlcnMgZm9yIDY0NDYwLgorCSAgIGluIDY0MzYwIHdoZW4gd3JpdGluZyB0byBwY2kgYmFzZSBnbyBhbmQgb3ZlcmlkZSByZW1hcCBhdXRvbWF0aWNhbHksCisJICAgaW4gNjQ0NjAgaXQgZG9lc24ndCAqLworCUdUX1JFR19XUklURSAoUENJXzBfSU9fQkFTRV9BRERSLCBDRkdfUENJMF9JT19CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8wSV9PX0FERFJFU1NfUkVNQVAsIENGR19QQ0kwX0lPX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzBfSU9fU0laRSwgKENGR19QQ0kwX0lPX1NJWkUgLSAxKSA+PiAxNik7CisKKwlHVF9SRUdfV1JJVEUgKFBDSV8wX01FTU9SWTBfQkFTRV9BRERSLCBDRkdfUENJMF9NRU1fQkFTRSA+PiAxNik7CisJR1RfUkVHX1dSSVRFIChQQ0lfME1FTU9SWTBfQUREUkVTU19SRU1BUCwgQ0ZHX1BDSTBfTUVNX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzBfTUVNT1JZMF9TSVpFLCAoQ0ZHX1BDSTBfTUVNX1NJWkUgLSAxKSA+PiAxNik7CisKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX0JBU0VfQUREUiwgQ0ZHX1BDSTFfSU9fQkFTRSA+PiAxNik7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlfT19BRERSRVNTX1JFTUFQLCBDRkdfUENJMV9JT19CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX1NJWkUsIChDRkdfUENJMV9JT19TSVpFIC0gMSkgPj4gMTYpOworCisJR1RfUkVHX1dSSVRFIChQQ0lfMV9NRU1PUlkwX0JBU0VfQUREUiwgQ0ZHX1BDSTFfTUVNX0JBU0UgPj4gMTYpOworCUdUX1JFR19XUklURSAoUENJXzFNRU1PUlkwX0FERFJFU1NfUkVNQVAsIENGR19QQ0kxX01FTV9CQVNFID4+IDE2KTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xX01FTU9SWTBfU0laRSwgKENGR19QQ0kxX01FTV9TSVpFIC0gMSkgPj4gMTYpOworCisJLyogUENJIGludGVyZmFjZSBzZXR0aW5ncyAqLworCS8qIFRpbWVvdXQgc2V0IHRvIHJldHJ5IGZvcmV2ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKFBDSV8wVElNRU9VVF9SRVRSWSwgMHgwKTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8xVElNRU9VVF9SRVRSWSwgMHgwKTsKKworCS8qIHJvbmVuIC0gZW5hYmxlIG9ubHkgQ1MwIGFuZCBJbnRlcm5hbCByZWchISAqLworCUdUX1JFR19XUklURSAoUENJXzBCQVNFX0FERFJFU1NfUkVHSVNURVJTX0VOQUJMRSwgMHhmZmZmZmRmZSk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUJBU0VfQUREUkVTU19SRUdJU1RFUlNfRU5BQkxFLCAweGZmZmZmZGZlKTsKKworLypyb25lbiB1cGRhdGUgdGhlIHBjaSBpbnRlcm5hbCByZWdpc3RlcnMgYmFzZSBhZGRyZXNzLiovCisjaWZkZWYgTUFQX1BDSQorCWZvciAoc3RhdCA9IDA7IHN0YXQgPD0gUENJX0hPU1QxOyBzdGF0KyspCisJCXBjaVdyaXRlQ29uZmlnUmVnIChzdGF0LAorCQkJCSAgIFBDSV9JTlRFUk5BTF9SRUdJU1RFUlNfTUVNT1JZX01BUFBFRF9CQVNFX0FERFJFU1MsCisJCQkJICAgU0VMRiwgQ0ZHX0dUX1JFR1MpOworI2VuZGlmCisKK30KKyNlbmRpZgorCisvKiBTZXR1cCBDUFUgaW50ZXJmYWNlIHBhcmFtYXRlcnMgKi8KK3N0YXRpYyB2b2lkIGd0X2NwdV9jb25maWcgKHZvaWQpCit7CisJY3B1X3QgY3B1ID0gZ2V0X2NwdV90eXBlICgpOworCXVsb25nIHRtcDsKKworCS8qIGNwdSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJdG1wID0gR1RSRUdSRUFEIChDUFVfQ09ORklHVVJBVElPTik7CisKKwkvKiBzZXQgdGhlIFNJTkdMRV9DUFUgYml0ICBzZWUgTVY2NDQ2MCBQLjM5OSAqLworI2lmbmRlZiBDRkdfR1RfRFVBTF9DUFUJCS8qIFNJTkdMRV9DUFUgc2VlbXMgdG8gY2F1c2UgSlRBRyBwcm9ibGVtcyAqLworCXRtcCB8PSBDUFVfQ09ORl9TSU5HTEVfQ1BVOworI2VuZGlmCisKKwl0bXAgJj0gfkNQVV9DT05GX0FBQ0tfREVMQVlfMjsKKworCXRtcCB8PSBDUFVfQ09ORl9EUF9WQUxJRDsKKwl0bXAgfD0gQ1BVX0NPTkZfQVBfVkFMSUQ7CisKKwl0bXAgfD0gQ1BVX0NPTkZfUElQRUxJTkU7CisKKwlHVF9SRUdfV1JJVEUgKENQVV9DT05GSUdVUkFUSU9OLCB0bXApOwkvKiBNYXJ2ZWxsIChWWFdvcmtzKSB3cml0ZXMgMHgyMDIyMEZGICovCisKKwkvKiBDUFUgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl0bXAgPSBHVFJFR1JFQUQgKENQVV9NQVNURVJfQ09OVFJPTCk7CisKKwl0bXAgfD0gQ1BVX01BU1RfQ1RMX0FSQl9FTjsKKworCWlmICgoY3B1ID09IENQVV83NDAwKSB8fAorCSAgICAoY3B1ID09IENQVV83NDEwKSB8fCAoY3B1ID09IENQVV83NDU1KSB8fCAoY3B1ID09IENQVV83NDUwKSkgeworCisJCXRtcCB8PSBDUFVfTUFTVF9DVExfQ0xFQU5fQkxLOworCQl0bXAgfD0gQ1BVX01BU1RfQ1RMX0ZMVVNIX0JMSzsKKworCX0gZWxzZSB7CisJCS8qIGNsZWFuYmxvY2sgbXVzdCBiZSBjbGVhcmVkIGZvciBDUFVzCisJCSAqIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhpcyBjb21tYW5kICg2MDNlLCA3NTApCisJCSAqIHNlZSBSZXMjMSAqLworCQl0bXAgJj0gfkNQVV9NQVNUX0NUTF9DTEVBTl9CTEs7CisJCXRtcCAmPSB+Q1BVX01BU1RfQ1RMX0ZMVVNIX0JMSzsKKwl9CisJR1RfUkVHX1dSSVRFIChDUFVfTUFTVEVSX0NPTlRST0wsIHRtcCk7Cit9CisKKy8qCisgKiBib2FyZF9wcmVfaW5pdC4KKyAqCisgKiBzZXQgdXAgZ2FsLiBkZXZpY2UgbWFwcGluZ3MsIGV0Yy4KKyAqLworaW50IGJvYXJkX3ByZV9pbml0ICh2b2lkKQoreworCXVjaGFyIHNyYW1fYm9vdCA9IDA7CisKKwkvKgorCSAqIHNldCB1cCB0aGUgR1QgdGhlIHdheSB0aGUga2VybmVsIHdhbnRzIGl0CisJICogdGhlIGNhbGwgdG8gbW92ZSB0aGUgR1QgcmVnaXN0ZXIgc3BhY2Ugd2lsbCBvYnZpb3VzbHkKKwkgKiBmYWlsIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZG9uZSwgYnV0IHdlJ3JlIGdvaW5nIHRvIGFzc3VtZQorCSAqIHRoYXQgaWYgaXQncyBub3QgYXQgdGhlIHBvd2VyLW9uIGxvY2F0aW9uLCBpdCdzIHdoZXJlIHdlIHB1dAorCSAqIGl0IGxhc3QgdGltZS4gKGh1YmVyKQorCSAqLworCisJbXlfcmVtYXBfZ3RfcmVncyAoQ0ZHX0RGTF9HVF9SRUdTLCBDRkdfR1RfUkVHUyk7CisKKwkvKiBObyBQQ0kgaW4gZmlyc3QgcmVsZWFzZSBvZiBQb3J0IFRvX2RvOiBlbmFibGUgaXQuICovCisjaWZkZWYgQ09ORklHX1BDSQorCWd0X3BjaV9jb25maWcgKCk7CisjZW5kaWYKKwkvKiBtYXNrIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHQgc291cmNlcyAqLworCUdUX1JFR19XUklURSAoQ1BVX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChDUFVfSU5URVJSVVBUX01BU0tfUkVHSVNURVJfSElHSCwgMCk7CisJLyogbmV3IGluIE1WNjQ0NnggKi8KKwlHVF9SRUdfV1JJVEUgKENQVV9JTlRFUlJVUFRfMV9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChDUFVfSU5URVJSVVBUXzFfTUFTS19SRUdJU1RFUl9ISUdILCAwKTsKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlHVF9SRUdfV1JJVEUgKFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfTE9XLCAwKTsKKwlHVF9SRUdfV1JJVEUgKFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfSElHSCwgMCk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlOVEVSUlVQVF9DQVVTRV9NQVNLX1JFR0lTVEVSX0xPVywgMCk7CisJR1RfUkVHX1dSSVRFIChQQ0lfMUlOVEVSUlVQVF9DQVVTRV9NQVNLX1JFR0lTVEVSX0hJR0gsIDApOworCS8qIGRvZXMgbm90IGV4aXN0IGluIE1WNjQ0NngKKwkgICBHVF9SRUdfV1JJVEUoQ1BVX0lOVF8wX01BU0ssIDApOworCSAgIEdUX1JFR19XUklURShDUFVfSU5UXzFfTUFTSywgMCk7CisJICAgR1RfUkVHX1dSSVRFKENQVV9JTlRfMl9NQVNLLCAwKTsKKwkgICBHVF9SRUdfV1JJVEUoQ1BVX0lOVF8zX01BU0ssIDApOworCSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKwkvKiAtLS0tLSBERVZJQ0UgQlVTIFNFVFRJTkdTIC0tLS0tLSAqLworCisJLyoKKwkgKiBFVkIKKwkgKiAwIC0gU1JBTSAgID8/Pz8KKwkgKiAxIC0gUlRDICAgICAgPz8/PworCSAqIDIgLSBVQVJUICAgICA/Pz8/CisJICogMyAtIEZsYXNoICAgIGNoZWNrZWQgMzJCaXQgSW50ZWwgU3RyYXRhCisJICogYm9vdCAtIEJvb3RDUyBjaGVja2VkIDhCaXQgMjlMVjA0MEIKKwkgKgorCSAqIFp1bWEKKwkgKiAwIC0gRmxhc2gKKwkgKiBib290IC0gQm9vdENTCisJICovCisKKwkvKgorCSAqIHRoZSBkdWFsIDc0NTAgbW9kdWxlIHJlcXVpcmVzIGJ1cnN0IGFjY2VzcyB0byB0aGUgYm9vdAorCSAqIGRldmljZSwgc28gdGhlIHNlcmlhbCByb20gY29waWVzIHRoZSBib290IGRldmljZSB0byB0aGUKKwkgKiBvbi1ib2FyZCBzcmFtIG9uIHRoZSBldmFsIGJvYXJkLCBhbmQgdXBkYXRlcyB0aGUgY29ycmVjdAorCSAqIHJlZ2lzdGVycyB0byBib290IGZyb20gdGhlIHNyYW0uIChkZXZpY2UwKQorCSAqLworCWlmIChtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyAoREVWSUNFMCkgPT0gQ0ZHX0RGTF9CT09UQ1NfQkFTRSkKKwkJc3JhbV9ib290ID0gMTsKKwlpZiAoIXNyYW1fYm9vdCkKKwkJbWVtb3J5TWFwRGV2aWNlU3BhY2UgKERFVklDRTAsIENGR19ERVYwX1NQQUNFLCBDRkdfREVWMF9TSVpFKTsKKworCW1lbW9yeU1hcERldmljZVNwYWNlIChERVZJQ0UxLCBDRkdfREVWMV9TUEFDRSwgQ0ZHX0RFVjFfU0laRSk7CisJbWVtb3J5TWFwRGV2aWNlU3BhY2UgKERFVklDRTIsIENGR19ERVYyX1NQQUNFLCBDRkdfREVWMl9TSVpFKTsKKwltZW1vcnlNYXBEZXZpY2VTcGFjZSAoREVWSUNFMywgQ0ZHX0RFVjNfU1BBQ0UsIENGR19ERVYzX1NJWkUpOworCisKKwkvKiBjb25maWd1cmUgZGV2aWNlIHRpbWluZyAqLworI2lmZGVmIENGR19ERVYwX1BBUgkJLyogc2V0IHBvcnQgcGFyYW1ldGVycyBmb3IgU1JBTSBkZXZpY2UgbW9kdWxlIGFjY2VzcyAqLworCWlmICghc3JhbV9ib290KQorCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CQU5LMFBBUkFNRVRFUlMsIENGR19ERVYwX1BBUik7CisjZW5kaWYKKworI2lmZGVmIENGR19ERVYxX1BBUgkJLyogc2V0IHBvcnQgcGFyYW1ldGVycyBmb3IgUlRDIGRldmljZSBtb2R1bGUgYWNjZXNzICovCisJR1RfUkVHX1dSSVRFIChERVZJQ0VfQkFOSzFQQVJBTUVURVJTLCBDRkdfREVWMV9QQVIpOworI2VuZGlmCisjaWZkZWYgQ0ZHX0RFVjJfUEFSCQkvKiBzZXQgcG9ydCBwYXJhbWV0ZXJzIGZvciBEVUFSVCBkZXZpY2UgbW9kdWxlIGFjY2VzcyAqLworCUdUX1JFR19XUklURSAoREVWSUNFX0JBTksyUEFSQU1FVEVSUywgQ0ZHX0RFVjJfUEFSKTsKKyNlbmRpZgorCisjaWZkZWYgQ0ZHXzMyQklUX0JPT1RfUEFSCS8qIHNldCBwb3J0IHBhcmFtZXRlcnMgZm9yIEZsYXNoIGRldmljZSBtb2R1bGUgYWNjZXNzICovCisJLyogZGV0ZWN0IGlmIHdlIGFyZSBib290aW5nIGZyb20gdGhlIDMyIGJpdCBmbGFzaCAqLworCWlmIChHVFJFR1JFQUQgKERFVklDRV9CT09UX0JBTktfUEFSQU1FVEVSUykgJiAoMHgzIDw8IDIwKSkgeworCQkvKiAzMiBiaXQgYm9vdCBmbGFzaCAqLworCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CQU5LM1BBUkFNRVRFUlMsIENGR184QklUX0JPT1RfUEFSKTsKKwkJR1RfUkVHX1dSSVRFIChERVZJQ0VfQk9PVF9CQU5LX1BBUkFNRVRFUlMsCisJCQkgICAgICBDRkdfMzJCSVRfQk9PVF9QQVIpOworCX0gZWxzZSB7CisJCS8qIDggYml0IGJvb3QgZmxhc2ggKi8KKwkJR1RfUkVHX1dSSVRFIChERVZJQ0VfQkFOSzNQQVJBTUVURVJTLCBDRkdfMzJCSVRfQk9PVF9QQVIpOworCQlHVF9SRUdfV1JJVEUgKERFVklDRV9CT09UX0JBTktfUEFSQU1FVEVSUywgQ0ZHXzhCSVRfQk9PVF9QQVIpOworCX0KKyNlbHNlCisJLyogOCBiaXQgYm9vdCBmbGFzaCBvbmx5ICovCisvKglHVF9SRUdfV1JJVEUoREVWSUNFX0JPT1RfQkFOS19QQVJBTUVURVJTLCBDRkdfOEJJVF9CT09UX1BBUik7Ki8KKyNlbmRpZgorCisKKwlndF9jcHVfY29uZmlnICgpOworCisJLyogTVBQIHNldHVwICovCisJR1RfUkVHX1dSSVRFIChNUFBfQ09OVFJPTDAsIENGR19NUFBfQ09OVFJPTF8wKTsKKwlHVF9SRUdfV1JJVEUgKE1QUF9DT05UUk9MMSwgQ0ZHX01QUF9DT05UUk9MXzEpOworCUdUX1JFR19XUklURSAoTVBQX0NPTlRST0wyLCBDRkdfTVBQX0NPTlRST0xfMik7CisJR1RfUkVHX1dSSVRFIChNUFBfQ09OVFJPTDMsIENGR19NUFBfQ09OVFJPTF8zKTsKKworCUdUX1JFR19XUklURSAoR1BQX0xFVkVMX0NPTlRST0wsIENGR19HUFBfTEVWRUxfQ09OVFJPTCk7CisJREVCVUdfTEVEMF9PTiAoKTsKKwlERUJVR19MRUQxX09OICgpOworCURFQlVHX0xFRDJfT04gKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdmFyaW91cyB0aGluZ3MgdG8gZG8gYWZ0ZXIgcmVsb2NhdGlvbiAqLworCitpbnQgbWlzY19pbml0X3IgKCkKK3sKKwlpY2FjaGVfZW5hYmxlICgpOworI2lmZGVmIENGR19MMgorCWwyY2FjaGVfZW5hYmxlICgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01QU0MKKworCW1wc2Nfc2RtYV9pbml0ICgpOworCW1wc2NfaW5pdDIgKCk7CisjZW5kaWYKKworI2lmIDAKKwkvKiBkaXNhYmxlIHRoZSBkY2FjaGUgYW5kIE1NVSAqLworCWRjYWNoZV9sb2NrICgpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWZ0ZXJfcmVsb2MgKHVsb25nIGRlc3RfYWRkciwgZ2RfdCAqIGdkKQoreworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBib290ZWQgZnJvbSB0aGUgc3JhbS4gIElmIHNvLCBtb3ZlIHRoaW5ncworCSAqIGJhY2sgdG8gdGhlIHdheSB0aGV5IHNob3VsZCBiZS4gKHdlJ3JlIHJ1bm5pbmcgZnJvbSBtYWluCisJICogbWVtb3J5IGF0IHRoaXMgcG9pbnQgbm93ICovCisJaWYgKG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChERVZJQ0UwKSA9PSBDRkdfREZMX0JPT1RDU19CQVNFKSB7CisJCW1lbW9yeU1hcERldmljZVNwYWNlIChERVZJQ0UwLCBDRkdfREVWMF9TUEFDRSwgQ0ZHX0RFVjBfU0laRSk7CisJCW1lbW9yeU1hcERldmljZVNwYWNlIChCT09UX0RFVklDRSwgQ0ZHX0RGTF9CT09UQ1NfQkFTRSwgXzhNKTsKKwl9CisJZGlzcGxheV9tZW1fbWFwICgpOworCS8qIG5vdywganVtcCB0byB0aGUgbWFpbiBwcGNib290IGJvYXJkIGluaXQgY29kZSAqLworCWJvYXJkX2luaXRfciAoZ2QsIGRlc3RfYWRkcik7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGVjayBCb2FyZCBJZGVudGl0eToKKyAqCisgKiByaWdodCBub3csIGFzc3VtZSBib3JhZCB0eXBlLiAodGhlcmUgaXMganVzdCBvbmUuLi5hZnRlciBhbGwpCisgKi8KKworaW50IGNoZWNrYm9hcmQgKHZvaWQpCit7CisJaW50IGxfdHlwZSA9IDA7CisKKwlwcmludGYgKCJCT0FSRDogJXNcbiIsIENGR19CT0FSRF9OQU1FKTsKKwlyZXR1cm4gKGxfdHlwZSk7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCit2b2lkIGRlYnVnX2xlZCAoaW50IGxlZCwgaW50IG1vZGUpCit7CisJdm9sYXRpbGUgaW50ICphZGRyID0gMDsKKwlpbnQgZHVtbXk7CisKKwlpZiAobW9kZSA9PSAxKSB7CisJCXN3aXRjaCAobGVkKSB7CisJCWNhc2UgMDoKKwkJCWFkZHIgPSAoaW50ICopICgodW5zaWduZWQgaW50KSBDRkdfREVWMV9TUEFDRSB8CisJCQkJCTB4MDgwMDApOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJYWRkciA9IChpbnQgKikgKCh1bnNpZ25lZCBpbnQpIENGR19ERVYxX1NQQUNFIHwKKwkJCQkJMHgwYzAwMCk7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlhZGRyID0gKGludCAqKSAoKHVuc2lnbmVkIGludCkgQ0ZHX0RFVjFfU1BBQ0UgfAorCQkJCQkweDEwMDAwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChtb2RlID09IDApIHsKKwkJc3dpdGNoIChsZWQpIHsKKwkJY2FzZSAwOgorCQkJYWRkciA9IChpbnQgKikgKCh1bnNpZ25lZCBpbnQpIENGR19ERVYxX1NQQUNFIHwKKwkJCQkJMHgxNDAwMCk7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlhZGRyID0gKGludCAqKSAoKHVuc2lnbmVkIGludCkgQ0ZHX0RFVjFfU1BBQ0UgfAorCQkJCQkweDE4MDAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCWFkZHIgPSAoaW50ICopICgodW5zaWduZWQgaW50KSBDRkdfREVWMV9TUEFDRSB8CisJCQkJCTB4MWMwMDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkdW1teSA9ICphZGRyOworfQorCitpbnQgZGlzcGxheV9tZW1fbWFwICh2b2lkKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGludCBiYXNlLCBzaXplLCB3aWR0aDsKKworCS8qIFNEUkFNICovCisJcHJpbnRmICgiU0QgKEREUikgUkFNXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDw9IEJBTkszOyBpKyspIHsKKwkJYmFzZSA9IG1lbW9yeUdldEJhbmtCYXNlQWRkcmVzcyAoaSk7CisJCXNpemUgPSBtZW1vcnlHZXRCYW5rU2l6ZSAoaSk7CisJCWlmIChzaXplICE9IDApIHsKKwkJCXByaW50ZiAoIkJBTkslZDogYmFzZSAtIDB4JTA4eFx0c2l6ZSAtICVkTSBieXRlc1xuIiwKKwkJCQlpLCBiYXNlLCBzaXplID4+IDIwKTsKKwkJfQorCX0KKworCS8qIENQVSdzIFBDSSB3aW5kb3dzICovCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfSE9TVDE7IGkrKykgeworCQlwcmludGYgKCJcbkNQVSdzIFBDSSAlZCB3aW5kb3dzXG4iLCBpKTsKKwkJYmFzZSA9IHBjaUdldFNwYWNlQmFzZSAoaSwgUENJX0lPKTsKKwkJc2l6ZSA9IHBjaUdldFNwYWNlU2l6ZSAoaSwgUENJX0lPKTsKKwkJcHJpbnRmICgiICAgICAgSU86IGJhc2UgLSAweCUwOHhcdHNpemUgLSAlZE0gYnl0ZXNcbiIsIGJhc2UsCisJCQlzaXplID4+IDIwKTsKKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDw9CisJCSAgICAgUENJX1JFR0lPTjAKKwkJICAgICAvKnJvbmVuIGN1cnJlbnRseSBvbmx5IGZpcnN0IFBDSSBNRU0gaXMgdXNlZCAzICovIDsKKwkJICAgICBqKyspIHsKKwkJCWJhc2UgPSBwY2lHZXRTcGFjZUJhc2UgKGksIGopOworCQkJc2l6ZSA9IHBjaUdldFNwYWNlU2l6ZSAoaSwgaik7CisJCQlwcmludGYgKCJNRU1PUlkgJWQ6IGJhc2UgLSAweCUwOHhcdHNpemUgLSAlZE0gYnl0ZXNcbiIsIGosIGJhc2UsIHNpemUgPj4gMjApOworCQl9CisJfQorCisJLyogRGV2aWNlcyAqLworCXByaW50ZiAoIlxuREVWSUNFU1xuIik7CisJZm9yIChpID0gMDsgaSA8PSBERVZJQ0UzOyBpKyspIHsKKwkJYmFzZSA9IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChpKTsKKwkJc2l6ZSA9IG1lbW9yeUdldERldmljZVNpemUgKGkpOworCQl3aWR0aCA9IG1lbW9yeUdldERldmljZVdpZHRoIChpKSAqIDg7CisJCXByaW50ZiAoIkRFViAlZDogIGJhc2UgLSAweCUwOHggIHNpemUgLSAlZE0gYnl0ZXNcdHdpZHRoIC0gJWQgYml0cyIsIGksIGJhc2UsIHNpemUgPj4gMjAsIHdpZHRoKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXByaW50ZiAoIlx0LSBFWFQgU1JBTSAoYWN0dWFsIC0gMU0pXG4iKTsKKwkJZWxzZSBpZiAoaSA9PSAxKQorCQkJcHJpbnRmICgiXHQtIFJUQ1xuIik7CisJCWVsc2UgaWYgKGkgPT0gMikKKwkJCXByaW50ZiAoIlx0LSBVQVJUXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiXHQtIExBUkdFIEZMQVNIXG4iKTsKKwl9CisKKwkvKiBCb290cm9tICovCisJYmFzZSA9IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzIChCT09UX0RFVklDRSk7CS8qIEJvb3QgKi8KKwlzaXplID0gbWVtb3J5R2V0RGV2aWNlU2l6ZSAoQk9PVF9ERVZJQ0UpOworCXdpZHRoID0gbWVtb3J5R2V0RGV2aWNlV2lkdGggKEJPT1RfREVWSUNFKSAqIDg7CisJcHJpbnRmICgiIEJPT1Q6ICBiYXNlIC0gMHglMDh4ICBzaXplIC0gJWRNIGJ5dGVzXHR3aWR0aCAtICVkIGJpdHNcbiIsCisJCWJhc2UsIHNpemUgPj4gMjAsIHdpZHRoKTsKKwlyZXR1cm4gKDApOworfQorCisvKiBEUkFNIGNoZWNrIHJvdXRpbmVzIGNvcGllZCBmcm9tIGd3ODI2MCAqLworCisjaWYgZGVmaW5lZCAoQ0ZHX0RSQU1fVEVTVCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICBtb3ZlNjQoKSAtICBtb3ZlcyBhIGRvdWJsZSB3b3JkICg2NC1iaXQpCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogREVTQ1JJUFRJT046CQkJCQkJCSAgICAgKi8KKy8qICAgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRvdWJsZSB3b3JkIG1vdmUgZnJvbSB0aGUgZGF0YSBhdAkgICAgICovCisvKiAgIHRoZSBzb3VyY2UgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gYXQgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIuICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIElOUFVUUzoJCQkJCQkJICAgICAqLworLyogICB1bnNpZ25lZCBsb25nIGxvbmcgKnNyYyAgLSBwb2ludGVyIHRvIGRhdGEgdG8gbW92ZQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0IC0gcG9pbnRlciB0byBsb2NhdGUgdG8gbW92ZSBkYXRhCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVRVUk5TOgkJCQkJCQkgICAgICovCisvKiAgIE5vbmUJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFU1RSSUNUSU9OUy9MSU1JVEFUSU9OUzoJCQkJCSAgICAgKi8KKy8qICAgTWF5IGNsb29iZXIgZnIwLgkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbW92ZTY0ICh1bnNpZ25lZCBsb25nIGxvbmcgKnNyYywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQoreworCWFzbSAoImxmZCAgMCwgMCgzKVxuXHQiCS8qIGZwcjAgICA9ICAqc2NyICAgICAgICovCisJICAgICAic3RmZCAwLCAwKDQpIgkvKiAqZGVzdCAgPSAgZnByMCAgICAgICAqLworICAgICAgOiA6IDogImZyMCIpOwkJLyogQ2xvYmJlcnMgZnIwICAgICAgICAgKi8KKwlyZXR1cm47Cit9CisKKworI2lmIGRlZmluZWQgKENGR19EUkFNX1RFU1RfREFUQSkKKwordW5zaWduZWQgbG9uZyBsb25nIHBhdHRlcm5bXSA9IHsKKwkweGFhYWFhYWFhYWFhYWFhYWEsCisJMHhjY2NjY2NjY2NjY2NjY2NjLAorCTB4ZjBmMGYwZjBmMGYwZjBmMCwKKwkweGZmMDBmZjAwZmYwMGZmMDAsCisJMHhmZmZmMDAwMGZmZmYwMDAwLAorCTB4ZmZmZmZmZmYwMDAwMDAwMCwKKwkweDAwMDAwMDAwZmZmZmZmZmYsCisJMHgwMDAwZmZmZjAwMDBmZmZmLAorCTB4MDBmZjAwZmYwMGZmMDBmZiwKKwkweDBmMGYwZjBmMGYwZjBmMGYsCisJMHgzMzMzMzMzMzMzMzMzMzMzLAorCTB4NTU1NTU1NTU1NTU1NTU1NQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICBtZW1fdGVzdF9kYXRhKCkgLSAgdGVzdCBkYXRhIGxpbmVzIGZvciBzaG9ydHMgYW5kIG9wZW5zICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogREVTQ1JJUFRJT046CQkJCQkJCSAgICAgKi8KKy8qICAgVGVzdHMgZGF0YSBsaW5lcyBmb3Igc2hvcnRzIGFuZCBvcGVucyBieSBmb3JjaW5nIGFkamFjZW50IGRhdGEgICovCisvKiAgIHRvIG9wcG9zaXRlIHN0YXRlcy4gQmVjYXVzZSB0aGUgZGF0YSBsaW5lcyBjb3VsZCBiZSByb3V0ZWQgaW4gICAqLworLyogICBhbiBhcmJpdHJhcnkgbWFubmVyIHRoZSBtdXN0IGVuc3VyZSB0ZXN0IHBhdHRlcm5zIGVuc3VyZSB0aGF0ICAgKi8KKy8qICAgZXZlcnkgY2FzZSBpcyB0ZXN0ZWQuIEJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIGJpbmFyeSAgICovCisvKiAgIHBhdHRlcm5zIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIGFkamFjZW50IGJpdHMgaXMgdGVzdCByZWdhcmRsZXNzICAqLworLyogICBvZiByb3V0aW5nLgkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgICAgLi4uMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwCQkJCSAgICAgKi8KKy8qICAgICAuLi4xMTAwMTEwMDExMDAxMTAwMTEwMDExMDAJCQkJICAgICAqLworLyogICAgIC4uLjExMTEwMDAwMTExMTAwMDAxMTExMDAwMAkJCQkgICAgICovCisvKiAgICAgLi4uMTExMTExMTEwMDAwMDAwMDExMTExMTExCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgIENhcnJ5aW5nIHRoaXMgb3V0LCBnaXZlcyB1cyBzaXggaGV4IHBhdHRlcm5zIGFzIGZvbGxvd3M6CSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgICAgMHhhYWFhYWFhYWFhYWFhYWFhCQkJCQkgICAgICovCisvKiAgICAgMHhjY2NjY2NjY2NjY2NjY2NjCQkJCQkgICAgICovCisvKiAgICAgMHhmMGYwZjBmMGYwZjBmMGYwCQkJCQkgICAgICovCisvKiAgICAgMHhmZjAwZmYwMGZmMDBmZjAwCQkJCQkgICAgICovCisvKiAgICAgMHhmZmZmMDAwMGZmZmYwMDAwCQkJCQkgICAgICovCisvKiAgICAgMHhmZmZmZmZmZjAwMDAwMDAwCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogICBUaGUgbnVtYmVyIHRlc3QgcGF0dGVybnMgd2lsbCBhbHdheXMgYmUgZ2l2ZW4gYnk6CQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogICBsb2coYmFzZSAyKShudW1iZXIgZGF0YSBiaXRzKSA9IGxvZzIgKDY0KSA9IDYJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiAgIFRvIHRlc3QgZm9yIHNob3J0IGFuZCBvcGVucyB0byBvdGhlciBzaWduYWxzIG9uIG91ciBib2FyZHMuIHdlICAqLworLyogICBzaW1wbHkJCQkJCQkJICAgICAqLworLyogICB0ZXN0IHdpdGggdGhlIDEncyBjb21wbGVtbnQgb2YgdGhlIHBhdGVybnMgYXMgd2VsbC4JICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgRGlzcGxheXMgZmFpbGluZyB0ZXN0IHBhdHRlcm4JCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKiAgQXNzdW1lcyBvbmx5IG9uZSBvbmUgU0RSQU0gYmFuawkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtZW1fdGVzdF9kYXRhICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyAqcG1lbSA9ICh1bnNpZ25lZCBsb25nIGxvbmcgKikgQ0ZHX01FTVRFU1RfU1RBUlQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHRlbXA2NDsKKwlpbnQgbnVtX3BhdHRlcm5zID0gc2l6ZW9mIChwYXR0ZXJuKSAvIHNpemVvZiAocGF0dGVyblswXSk7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGhpLCBsbzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGF0dGVybnM7IGkrKykgeworCQltb3ZlNjQgKCYocGF0dGVybltpXSksIHBtZW0pOworCQltb3ZlNjQgKHBtZW0sICZ0ZW1wNjQpOworCisJCS8qIGhpID0gKHRlbXA2ND4+MzIpICYgMHhmZmZmZmZmZjsgICAgICAgICAgKi8KKwkJLyogbG8gPSB0ZW1wNjQgJiAweGZmZmZmZmZmOyAgICAgICAgICAgICAgICAqLworCQkvKiBwcmludGYoIlxudGVtcDY0ID0gMHglMDh4JTA4eCIsIGhpLCBsbyk7ICovCisKKwkJaGkgPSAocGF0dGVybltpXSA+PiAzMikgJiAweGZmZmZmZmZmOworCQlsbyA9IHBhdHRlcm5baV0gJiAweGZmZmZmZmZmOworCQkvKiBwcmludGYoIlxucGF0dGVyblslZF0gPSAweCUwOHglMDh4IiwgaSwgaGksIGxvKTsgICovCisKKwkJaWYgKHRlbXA2NCAhPSBwYXR0ZXJuW2ldKSB7CisJCQlwcmludGYgKCJcbiAgIERhdGEgVGVzdCBGYWlsZWQsIHBhdHRlcm4gMHglMDh4JTA4eCIsCisJCQkJaGksIGxvKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ0ZHX0RSQU1fVEVTVF9EQVRBICovCisKKyNpZiBkZWZpbmVkIChDRkdfRFJBTV9URVNUX0FERFJFU1MpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogIG1lbV90ZXN0X2FkZHJlc3MoKSAtCXRlc3QgYWRkcmVzcyBsaW5lcwkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSB0ZXN0IHRvIHZlcmlmeSB0aGF0IGVhY2ggd29yZCBpbQkgICAgICovCisvKiAgIG1lbW9yeSBpcyB1bmlxdWx5IGFkZHJlc3NhYmxlLiBUaGUgdGVzdCBzZXF1ZW5jZSBpcyBhcyBmb2xsb3dzOiAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qICAgMSkgd3JpdGUgdGhlIGFkZHJlc3Mgb2YgZWFjaCB3b3JkIHRvIGVhY2ggd29yZC4JCSAgICAgKi8KKy8qICAgMikgdmVyaWZ5IHRoYXQgZWFjaCBsb2NhdGlvbiBlcXVhbHMgaXRzIGFkZHJlc3MJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBPVVRQVVRTOgkJCQkJCQkgICAgICovCisvKiAgIERpc3BsYXlzIGZhaWxpbmcgdGVzdCBwYXR0ZXJuIGFuZCBhZGRyZXNzCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX3Rlc3RfYWRkcmVzcyAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnBtZW0gPQorCQkodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIENGR19NRU1URVNUX1NUQVJUOworCWNvbnN0IHVuc2lnbmVkIGludCBzaXplID0gKENGR19NRU1URVNUX0VORCAtIENGR19NRU1URVNUX1NUQVJUKSAvIDQ7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiB3cml0ZSBhZGRyZXNzIHRvIGVhY2ggbG9jYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXBtZW1baV0gPSBpOworCX0KKworCS8qIHZlcmlmeSBlYWNoIGxvYWN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAocG1lbVtpXSAhPSBpKSB7CisJCQlwcmludGYgKCJcbiAgIEFkZHJlc3MgVGVzdCBGYWlsZWQgYXQgMHgleCIsIGkpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ0ZHX0RSQU1fVEVTVF9BRERSRVNTICovCisKKyNpZiBkZWZpbmVkIChDRkdfRFJBTV9URVNUX1dBTEspCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogICBtZW1fbWFyY2goKSAtICBtZW1vcnkgbWFyY2gJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIE1hcmNoZXMgdXAgdGhyb3VnaCBtZW1vcnkuIEF0IGVhY2ggbG9jYXRpb24gdmVyaWZpZXMgcm1hc2sgaWYgICAqLworLyogICByZWFkID0gMS4gQXQgZWFjaCBsb2NhdGlvbiB3cml0ZSB3bWFzayBpZgl3cml0ZSA9IDEuIERpc3BsYXlzICAqLworLyogICBmYWlsaW5nIGFkZHJlc3MgYW5kIHBhdHRlcm4uCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBJTlBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICogYmFzZSAtIHN0YXJ0IGFkZHJlc3Mgb2YgdGVzdAkgICAgICovCisvKiAgIHVuc2lnbmVkIGludCBzaXplIC0gbnVtYmVyIG9mIGR3b3Jkcyg2NC1iaXQpIHRvIHRlc3QJICAgICAqLworLyogICB1bnNpZ25lZCBsb25nIGxvbmcgcm1hc2sgLSByZWFkIHZlcmlmeSBtYXNrCQkgICAgICovCisvKiAgIHVuc2lnbmVkIGxvbmcgbG9uZyB3bWFzayAtIHdydGllIHZlcmlmeSBtYXNrCQkgICAgICovCisvKiAgIHNob3J0IHJlYWQgLSB2ZXJpZmllcyBybWFzayBpZiByZWFkID0gMQkJCSAgICAgKi8KKy8qICAgc2hvcnQgd3JpdGUgIC0gd3JpdGVzIHdtYXNrIGlmIHdyaXRlID0gMQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBPVVRQVVRTOgkJCQkJCQkgICAgICovCisvKiAgIERpc3BsYXlzIGZhaWxpbmcgdGVzdCBwYXR0ZXJuIGFuZCBhZGRyZXNzCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX21hcmNoICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKmJhc2UsCisJICAgICAgIHVuc2lnbmVkIGludCBzaXplLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcm1hc2ssCisJICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB3bWFzaywgc2hvcnQgcmVhZCwgc2hvcnQgd3JpdGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHRlbXA7CisJdW5zaWduZWQgaW50IGhpdGVtcCwgbG90ZW1wLCBoaW1hc2ssIGxvbWFzazsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKHJlYWQgIT0gMCkgeworCQkJLyogdGVtcCA9IGJhc2VbaV07ICovCisJCQltb3ZlNjQgKCh1bnNpZ25lZCBsb25nIGxvbmcgKikgJihiYXNlW2ldKSwgJnRlbXApOworCQkJaWYgKHJtYXNrICE9IHRlbXApIHsKKwkJCQloaXRlbXAgPSAodGVtcCA+PiAzMikgJiAweGZmZmZmZmZmOworCQkJCWxvdGVtcCA9IHRlbXAgJiAweGZmZmZmZmZmOworCQkJCWhpbWFzayA9IChybWFzayA+PiAzMikgJiAweGZmZmZmZmZmOworCQkJCWxvbWFzayA9IHJtYXNrICYgMHhmZmZmZmZmZjsKKworCQkJCXByaW50ZiAoIlxuIFdhbGtpbmcgb25lJ3MgdGVzdCBmYWlsZWQ6IGFkZHJlc3MgPSAweCUwOHgsIiAiXG5cdGV4cGVjdGVkIDB4JTA4eCUwOHgsIGZvdW5kIDB4JTA4eCUwOHgiLCBpIDw8IDMsIGhpbWFzaywgbG9tYXNrLCBoaXRlbXAsIGxvdGVtcCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJaWYgKHdyaXRlICE9IDApIHsKKwkJCS8qICBiYXNlW2ldID0gd21hc2s7ICovCisJCQltb3ZlNjQgKCZ3bWFzaywgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSAmKGJhc2VbaV0pKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDRkdfRFJBTV9URVNUX1dBTEsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5BTUU6ICAgbWVtX3Rlc3Rfd2FsaygpIC0gIGEgc2ltcGxlIHdhbGtpbmcgb25lcyB0ZXN0CSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBERVNDUklQVElPTjoJCQkJCQkJICAgICAqLworLyogICBQZXJmb3JtcyBhIHdhbGtpbmcgb25lcyB0aHJvdWdoIGVudGlyZSBwaHlzaWNhbCBtZW1vcnkuIFRoZSAgICAgKi8KKy8qICAgdGVzdCB1c2VzIGFzIHNlcmllcyBvZiBtZW1vcnkgbWFyY2hlcywgbWVtX21hcmNoKCksIHRvIHZlcmlmeSAgICovCisvKiAgIGFuZCB3cml0ZSB0aGUgdGVzdCBwYXR0ZXJucyB0byBtZW1vcnkuIFRoZSB0ZXN0IHNlcXVlbmNlIGlzIGFzICAqLworLyogICBmb2xsb3dzOgkJCQkJCQkgICAgICovCisvKiAgICAgMSkgbWFyY2ggd3JpdGluZyAwMDAwLi4uMDAwMQkJCQkgICAgICovCisvKiAgICAgMikgbWFyY2ggdmVyaWZ5aW5nIDAwMDAuLi4wMDAxICAsIHdyaXRpbmcgIDAwMDAuLi4wMDEwCSAgICAgKi8KKy8qICAgICAzKSByZXBlYXQgc3RlcCAyIHNoaWZ0aW5nIG1hc2tzIGxlZnQgMSBiaXQgZWFjaCB0aW1lIHVuaXRsICAgICovCisvKgkgICB0aGUgd3JpdGUgbWFzayBlcXVhbHMgMTAwMC4uLjAwMDAJCQkgICAgICovCisvKiAgICAgNCkgbWFyY2ggdmVyaWZ5aW5nIDEwMDAuLi4wMDAwCQkJCSAgICAgKi8KKy8qICAgVGhlIHRlc3QgZmFpbHMgaWYgYW55IG9mIHRoZSBtZW1vcnkgbWFyY2hlcyByZXR1cm4gYSBmYWlsdXJlLiAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogT1VUUFVUUzoJCQkJCQkJICAgICAqLworLyogICBEaXNwbGF5cyB3aGljaCBwYXNzIG9uIHRoZSBtZW1vcnkgdGVzdCBpcyBleGVjdXRpbmcJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFVFVSTlM6CQkJCQkJCSAgICAgKi8KKy8qICAgMCAtICBQYXNzZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qICAgMSAtICBGYWlsZWQgdGVzdAkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBSRVNUUklDVElPTlMvTElNSVRBVElPTlM6CQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWVtX3Rlc3Rfd2FsayAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWFzazsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvbmcgKnBtZW0gPQorCQkodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb25nICopIENGR19NRU1URVNUX1NUQVJUOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgc2l6ZSA9IChDRkdfTUVNVEVTVF9FTkQgLSBDRkdfTUVNVEVTVF9TVEFSVCkgLyA4OworCisJdW5zaWduZWQgaW50IGk7CisKKwltYXNrID0gMHgwMTsKKworCXByaW50ZiAoIkluaXRpYWwgUGFzcyIpOworCW1lbV9tYXJjaCAocG1lbSwgc2l6ZSwgMHgwLCAweDEsIDAsIDEpOworCisJcHJpbnRmICgiXGJcYlxiXGJcYlxiXGJcYlxiXGJcYlxiIik7CisJcHJpbnRmICgiCQkiKTsKKwlwcmludGYgKCIgICAgICAgICAiKTsKKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKworCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKSB7CisJCXByaW50ZiAoIlBhc3MgJTJkIiwgaSArIDIpOworCQlpZiAobWVtX21hcmNoIChwbWVtLCBzaXplLCBtYXNrLCBtYXNrIDw8IDEsIDEsIDEpICE9IDApIHsKKwkJCS8qcHJpbnRmKCJtYXNrOiAweCV4LCBwYXNzOiAlZCwgIiwgbWFzaywgaSk7ICovCisJCQlyZXR1cm4gMTsKKwkJfQorCQltYXNrID0gbWFzayA8PCAxOworCQlwcmludGYgKCJcYlxiXGJcYlxiXGJcYiIpOworCX0KKworCXByaW50ZiAoIkxhc3QgUGFzcyIpOworCWlmIChtZW1fbWFyY2ggKHBtZW0sIHNpemUsIDAsIG1hc2ssIDAsIDEpICE9IDApIHsKKwkJLyogcHJpbnRmKCJtYXNrOiAweCV4IiwgbWFzayk7ICovCisJCXJldHVybiAxOworCX0KKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKwlwcmludGYgKCIJICAgICAiKTsKKwlwcmludGYgKCJcYlxiXGJcYlxiXGJcYlxiXGIiKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTkFNRTogICAgdGVzdGRyYW0oKSAtICBjYWxscyBhbnkgZW5hYmxlZCBtZW1vcnkgdGVzdHMJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIERFU0NSSVBUSU9OOgkJCQkJCQkgICAgICovCisvKiAgIFJ1bnMgbWVtb3J5IHRlc3RzIGlmIHRoZSBlbnZpcm9ubWVudCB0ZXN0IHZhcmlhYmxlcyBhcmUgc2V0IHRvICAqLworLyogICAneScuCQkJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKiBJTlBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgdGVzdGRyYW1kYXRhICAgIC0gSWYgc2V0IHRvICd5JywgZGF0YSB0ZXN0IGlzIHJ1bi4JCSAgICAgKi8KKy8qICAgdGVzdGRyYW1hZGRyZXNzIC0gSWYgc2V0IHRvICd5JywgYWRkcmVzcyB0ZXN0IGlzIHJ1bi4JICAgICAqLworLyogICB0ZXN0ZHJhbXdhbGsgICAgLSBJZiBzZXQgdG8gJ3knLCB3YWxraW5nIG9uZXMgdGVzdCBpcyBydW4JICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIE9VVFBVVFM6CQkJCQkJCSAgICAgKi8KKy8qICAgTm9uZQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyogUkVUVVJOUzoJCQkJCQkJICAgICAqLworLyogICAwIC0gIFBhc3NlZCB0ZXN0CQkJCQkJICAgICAqLworLyogICAxIC0gIEZhaWxlZCB0ZXN0CQkJCQkJICAgICAqLworLyoJCQkJCQkJCSAgICAgKi8KKy8qIFJFU1RSSUNUSU9OUy9MSU1JVEFUSU9OUzoJCQkJCSAgICAgKi8KKy8qCQkJCQkJCQkgICAgICovCisvKgkJCQkJCQkJICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0ZXN0ZHJhbSAodm9pZCkKK3sKKwljaGFyICpzOworCWludCBydW5kYXRhLCBydW5hZGRyZXNzLCBydW53YWxrOworCisJcyA9IGdldGVudiAoInRlc3RkcmFtZGF0YSIpOworCXJ1bmRhdGEgPSAocyAmJiAoKnMgPT0gJ3knKSkgPyAxIDogMDsKKwlzID0gZ2V0ZW52ICgidGVzdGRyYW1hZGRyZXNzIik7CisJcnVuYWRkcmVzcyA9IChzICYmICgqcyA9PSAneScpKSA/IDEgOiAwOworCXMgPSBnZXRlbnYgKCJ0ZXN0ZHJhbXdhbGsiKTsKKwlydW53YWxrID0gKHMgJiYgKCpzID09ICd5JykpID8gMSA6IDA7CisKKy8qICAgIHJ1bmRhdGEgPSAxOyAqLworLyogICAgcnVuYWRkcmVzcyA9IDA7ICovCisvKiAgICBydW53YWxrID0gMDsgKi8KKworCWlmICgocnVuZGF0YSA9PSAxKSB8fCAocnVuYWRkcmVzcyA9PSAxKSB8fCAocnVud2FsayA9PSAxKSkgeworCQlwcmludGYgKCJUZXN0aW5nIFJBTSBmcm9tIDB4JTA4eCB0byAweCUwOHggLi4uICAoZG9uJ3QgcGFuaWMuLi4gdGhhdCB3aWxsIHRha2UgYSBtb21lbnQgISEhISlcbiIsIENGR19NRU1URVNUX1NUQVJULCBDRkdfTUVNVEVTVF9FTkQpOworCX0KKyNpZmRlZiBDRkdfRFJBTV9URVNUX0RBVEEKKwlpZiAocnVuZGF0YSA9PSAxKSB7CisJCXByaW50ZiAoIlRlc3QgREFUQSAuLi4gICIpOworCQlpZiAobWVtX3Rlc3RfZGF0YSAoKSA9PSAxKSB7CisJCQlwcmludGYgKCJmYWlsZWQgXG4iKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UKKwkJCXByaW50ZiAoIm9rIFxuIik7CisJfQorI2VuZGlmCisjaWZkZWYgQ0ZHX0RSQU1fVEVTVF9BRERSRVNTCisJaWYgKHJ1bmFkZHJlc3MgPT0gMSkgeworCQlwcmludGYgKCJUZXN0IEFERFJFU1MgLi4uICAiKTsKKwkJaWYgKG1lbV90ZXN0X2FkZHJlc3MgKCkgPT0gMSkgeworCQkJcHJpbnRmICgiZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlwcmludGYgKCJvayBcbiIpOworCX0KKyNlbmRpZgorI2lmZGVmIENGR19EUkFNX1RFU1RfV0FMSworCWlmIChydW53YWxrID09IDEpIHsKKwkJcHJpbnRmICgiVGVzdCBXQUxLSU5HIE9ORXMgLi4uICAiKTsKKwkJaWYgKG1lbV90ZXN0X3dhbGsgKCkgPT0gMSkgeworCQkJcHJpbnRmICgiZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlCisJCQlwcmludGYgKCJvayBcbiIpOworCX0KKyNlbmRpZgorCWlmICgocnVuZGF0YSA9PSAxKSB8fCAocnVuYWRkcmVzcyA9PSAxKSB8fCAocnVud2FsayA9PSAxKSkgeworCQlwcmludGYgKCJwYXNzZWRcbiIpOworCX0KKwlyZXR1cm4gMDsKKworfQorI2VuZGlmIC8qIENGR19EUkFNX1RFU1QgKi8KKworLyogcm9uZW4gLSB0aGUgYmVsb3cgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IHRoZSBib290bSBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qICAtIHdlIG1hcCB0aGUgYmFzZSByZWdpc3RlciB0byBmYmUwMDAwMCAoc2FtZSBtYXBwaW5nIGFzIGluIHRoZSBMU1ApICovCisvKiAgLSB3ZSB0dXJuIG9mZiB0aGUgUlggZ2lnIGRtYXMgLSB0byBwcmV2ZW50IHRoZSBkbWEgZnJvbSBvdmVydW5uaW5nICAqLworLyogICAgdGhlIGtlcm5lbCBkYXRhIGFyZWFzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAtIHdlIGRpYWJsZSBhbmQgaW52YWxpZGF0ZSB0aGUgaWNhY2hlIGFuZCBkY2FjaGUuICAgICAgICAgICAgICAgICAgICovCit2b2lkIG15X3JlbWFwX2d0X3JlZ3NfYm9vdG0gKHUzMiBjdXJfbG9jLCB1MzIgbmV3X2xvYykKK3sKKwl1MzIgdGVtcDsKKworCXRlbXAgPSBpbl9sZTMyICgodTMyICopIChuZXdfbG9jICsgSU5URVJOQUxfU1BBQ0VfREVDT0RFKSk7CisJaWYgKCh0ZW1wICYgMHhmZmZmKSA9PSBuZXdfbG9jID4+IDE2KQorCQlyZXR1cm47CisKKwl0ZW1wID0gKGluX2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpKSAmCisJCTB4ZmZmZjAwMDApIHwgKG5ld19sb2MgPj4gMTYpOworCisJb3V0X2xlMzIgKCh1MzIgKikgKGN1cl9sb2MgKyBJTlRFUk5BTF9TUEFDRV9ERUNPREUpLCB0ZW1wKTsKKworCXdoaWxlICgoV09SRF9TV0FQICgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKE5PTkVfQ0FDSEVBQkxFIHwKKwkJCQkJCQluZXdfbG9jIHwKKwkJCQkJCQkoSU5URVJOQUxfU1BBQ0VfREVDT0RFKSkpKSkKKwkgICAgICAgIT0gdGVtcCk7CisKK30KKwordm9pZCBib2FyZF9wcmVib290bV9pbml0ICgpCit7CisKKy8qIGNoYW5nZSB3aW5kb3cgc2l6ZSBvZiBQQ0kxIElPIGluIG9yZGVyIHRwIHByZXZlbnQgb3ZlcmxhcGluZyB3aXRoIFJFRyBCQVNFLiAqLworCQlHVF9SRUdfV1JJVEUgKFBDSV8xX0lPX1NJWkUsIChfNjRLIC0gMSkgPj4gMTYpOworCisvKiBTdG9wIEdpZ0UgUnggRE1BIGVuZ2luZXMgKi8KKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKDApLCAweDAwMDBmZjAwKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKDEpLCAweDAwMDBmZjAwKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKDIpLCAweDAwMDBmZjAwKTsKKworLyogUmVsb2NhdGUgTVY2NDQ2MCBpbnRlcm5hbCByZWdzICovCisJbXlfcmVtYXBfZ3RfcmVnc19ib290bSAoQ0ZHX0dUX1JFR1MsIEJSSURHRV9SRUdfQkFTRV9CT09UTSk7CisKKwlpY2FjaGVfZGlzYWJsZSAoKTsKKwlpbnZhbGlkYXRlX2wxX2luc3RydWN0aW9uX2NhY2hlICgpOworCWZsdXNoX2RhdGFfY2FjaGUgKCk7CisJZGNhY2hlX2Rpc2FibGUgKCk7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvZXRoLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzYjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9ldGguaApAQCAtMCwwICsxLDQxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogZXRoLmggLSBoZWFkZXIgZmlsZSBmb3IgdGhlIHBvbGxlZCBtb2RlIEdUIGV0aGVybmV0IGRyaXZlcgorICovCisKKyNpZm5kZWYgX19FVkI2NDQ2MF9FVEhfSF9fCisjZGVmaW5lIF9fRVZCNjQ0NjBfRVRIX0hfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorCitpbnQgZGI2NDQ2MF9ldGgwX3BvbGwodm9pZCk7CitpbnQgZGI2NDQ2MF9ldGgwX3RyYW5zbWl0KHVuc2lnbmVkIGludCBzLCB2b2xhdGlsZSBjaGFyICpwKTsKK3ZvaWQgZGI2NDQ2MF9ldGgwX2Rpc2FibGUodm9pZCk7Citib29sIG5ldHdvcmtfc3RhcnQoYmRfdCAqYmlzKTsKKworI2VuZGlmIC8qIF9fRVZCNjQ0NjBfRVRIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0NDYwL21wc2MuYyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tcHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmYmM0OQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tcHNjLmMKQEAgLTAsMCArMSwxMDE5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb2huIENsZW1lbnMgPGNsZW1lbnNAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNoYW5nZXMgZm9yIE1hcnZlbGwgREI2NDQ2MCBldmFsIGJvYXJkIDIwMDMgYnkgSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogbXBzYy5jIC0gZHJpdmVyIGZvciBjb25zb2xlIG92ZXIgdGhlIE1QU0MuCisgKi8KKworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJtcHNjLmgiCisKKyNpbmNsdWRlICJtdl9yZWdzLmgiCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21lbW9yeS5oIgorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIE1QU0MgYXMgYSByZWdpc3RlciBiYXNlZCBVQVJULgorICogVGhpcyB3aWxsIGZvcmNlIHRoZSBzZXJpYWwgcG9ydCB0byBub3QgdXNlIHRoZSBTRE1BIGVuZ2luZSBhdCBhbGwuCisgKi8KKyN1bmRlZiBDT05GSUdfTVBTQ19ERUJVR19QT1JUCisKKworaW50ICgqbXBzY19wdXRjaGFyKSAoY2hhciBjaCkgPSBtcHNjX3B1dGNoYXJfZWFybHk7CitjaGFyICgqbXBzY19nZXRjaGFyKSAodm9pZCkgPSBtcHNjX2dldGNoYXJfZGVidWc7CitpbnQgKCptcHNjX3Rlc3RfY2hhcikgKHZvaWQpID0gbXBzY190ZXN0X2NoYXJfZGVidWc7CisKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGludCAqcnhfZGVzY19iYXNlID0gTlVMTDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfZGVzY19pbmRleCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50ICp0eF9kZXNjX2Jhc2UgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGludCB0eF9kZXNjX2luZGV4ID0gMDsKKworLyogbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IGdhbG1wc2NfY29ubmVjdCAoaW50IGNoYW5uZWwsIGludCBjb25uZWN0KTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19yb3V0ZV9yeF9jbG9jayAoaW50IGNoYW5uZWwsIGludCBicmcpOworc3RhdGljIGludCBnYWxtcHNjX3JvdXRlX3R4X2Nsb2NrIChpbnQgY2hhbm5lbCwgaW50IGJyZyk7CitzdGF0aWMgaW50IGdhbG1wc2Nfd3JpdGVfY29uZmlnX3JlZ3MgKGludCBtcHNjLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGdhbG1wc2NfY29uZmlnX2NoYW5uZWxfcmVncyAoaW50IG1wc2MpOworc3RhdGljIGludCBnYWxtcHNjX3NldF9jaGFyX2xlbmd0aCAoaW50IG1wc2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X3N0b3BfYml0X2xlbmd0aCAoaW50IG1wc2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X3Bhcml0eSAoaW50IG1wc2MsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbG1wc2NfZW50ZXJfaHVudCAoaW50IG1wc2MpOworc3RhdGljIGludCBnYWxtcHNjX3NldF9icmtjbnQgKGludCBtcHNjLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBnYWxtcHNjX3NldF90Y3NjaGFyIChpbnQgbXBzYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfc25vb3AgKGludCBtcHNjLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBnYWxtcHNjX3NodXRkb3duIChpbnQgbXBzYyk7CisKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfUkZUIChpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X1NGTSAoaW50IGNoYW5uZWwpOworc3RhdGljIGludCBnYWxzZG1hX3NldF9yeGxlIChpbnQgY2hhbm5lbCk7CitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X3R4bGUgKGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfYnVyc3RzaXplIChpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfUkMgKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworCitzdGF0aWMgaW50IGdhbGJyZ19zZXRfQ0RWIChpbnQgY2hhbm5lbCwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgZ2FsYnJnX2VuYWJsZSAoaW50IGNoYW5uZWwpOworc3RhdGljIGludCBnYWxicmdfZGlzYWJsZSAoaW50IGNoYW5uZWwpOworc3RhdGljIGludCBnYWxicmdfc2V0X2Nsa3NyYyAoaW50IGNoYW5uZWwsIGludCB2YWx1ZSk7CitzdGF0aWMgaW50IGdhbGJyZ19zZXRfQ1VWIChpbnQgY2hhbm5lbCwgaW50IHZhbHVlKTsKKworc3RhdGljIHZvaWQgZ2Fsc2RtYV9lbmFibGVfcnggKHZvaWQpOworc3RhdGljIGludCBnYWxzZG1hX3NldF9tZW1fc3BhY2UgKHVuc2lnbmVkIGludCBtZW1TcGFjZSwKKwkJCQkgIHVuc2lnbmVkIGludCBtZW1TcGFjZVRhcmdldCwKKwkJCQkgIHVuc2lnbmVkIGludCBtZW1TcGFjZUF0dHIsCisJCQkJICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsCisJCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKworI2RlZmluZSBTT0ZUV0FSRV9DQUNIRV9NQU5BR0VNRU5UCisKKyNpZmRlZiBTT0ZUV0FSRV9DQUNIRV9NQU5BR0VNRU5UCisjZGVmaW5lIEZMVVNIX0RDQUNIRShhLGIpCQkgaWYoZGNhY2hlX3N0YXR1cygpKXtjbGVhbl9kY2FjaGVfcmFuZ2UoKHUzMikoYSksKHUzMikoYikpO30KKyNkZWZpbmUgRkxVU0hfQU5EX0lOVkFMSURBVEVfRENBQ0hFKGEsYikgaWYoZGNhY2hlX3N0YXR1cygpKXtmbHVzaF9kY2FjaGVfcmFuZ2UoKHUzMikoYSksKHUzMikoYikpO30KKyNkZWZpbmUgSU5WQUxJREFURV9EQ0FDSEUoYSxiKQkJIGlmKGRjYWNoZV9zdGF0dXMoKSl7aW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHUzMikoYSksKHUzMikoYikpO30KKyNlbHNlCisjZGVmaW5lIEZMVVNIX0RDQUNIRShhLGIpCisjZGVmaW5lIEZMVVNIX0FORF9JTlZBTElEQVRFX0RDQUNIRShhLGIpCisjZGVmaW5lIElOVkFMSURBVEVfRENBQ0hFKGEsYikKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01QU0NfREVCVUdfUE9SVAorc3RhdGljIHZvaWQgbXBzY19kZWJ1Z19pbml0ICh2b2lkKQoreworCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHRlbXA7CisKKwkvKiBDbGVhciB0aGUgQ0ZSICAoQ0hSNCkgKi8KKwkvKiBXcml0ZSByYW5kb20gJ1onIGJpdCAoYml0IDI5KSBvZiBDSFI0IHRvIGVuYWJsZSBkZWJ1ZyB1YXJ0ICpVTkRPQ1VNRU5URUQgRkVBVFVSRSogKi8KKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfNCArIChDSEFOTkVMICogR0FMTVBTQ19pbmRlbnQ6IFN0YW5kYXJkIGlucHV0OjIyOTogV2FybmluZzpvbGQgc3R5bGUgYXNzaWdubWVudCBhbWJpZ3VpdHkgaW4gIj0mIi4gIEFzc3VtaW5nICI9ICYiCisKK1JFR19HQVApKTsKKwl0ZW1wICY9IDB4ZmZmZmZmMDA7CisJdGVtcCB8PSBCSVQyOTsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR180ICsgKENIQU5ORUwgKiBHQUxNUFNDX1JFR19HQVApLAorCQkgICAgICB0ZW1wKTsKKworCS8qIFNldCB0aGUgVmFsaWQgYml0ICdWJyAoYml0IDEyKSBhbmQgaW50IGdlbmVyYXRpb24gYml0ICdJTlQnIChiaXQgMTUpICovCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzUgKyAoQ0hBTk5FTCAqIEdBTE1QU0NfUkVHX0dBUCkpOworCXRlbXAgfD0gKEJJVDEyIHwgQklUMTUpOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzUgKyAoQ0hBTk5FTCAqIEdBTE1QU0NfUkVHX0dBUCksCisJCSAgICAgIHRlbXApOworCisJLyogU2V0IGludCBtYXNrICovCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ18wX0lOVF9NQVNLKTsKKwl0ZW1wIHw9IEJJVDY7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDXzBfSU5UX01BU0ssIHRlbXApOworfQorI2VuZGlmCisKK2NoYXIgbXBzY19nZXRjaGFyX2RlYnVnICh2b2lkKQoreworCXZvbGF0aWxlIGludCB0ZW1wOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjYXVzZTsKKworCWNhdXNlID0gR1RSRUdSRUFEIChHQUxNUFNDXzBfSU5UX0NBVVNFKTsKKwl3aGlsZSAoKGNhdXNlICYgQklUNikgPT0gMCkgeworCQljYXVzZSA9IEdUUkVHUkVBRCAoR0FMTVBTQ18wX0lOVF9DQVVTRSk7CisJfQorCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzEwICsKKwkJCSAgKENIQU5ORUwgKiBHQUxNUFNDX1JFR19HQVApKTsKKwkvKiBCeSB3cml0aW5nIDEncyB0byB0aGUgc2V0IGJpdHMsIHRoZSByZWdpc3RlciBpcyBjbGVhcmVkICovCisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMTAgKyAoQ0hBTk5FTCAqIEdBTE1QU0NfUkVHX0dBUCksCisJCSAgICAgIHRlbXApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ18wX0lOVF9DQVVTRSwgY2F1c2UgJiB+QklUNik7CisJcmV0dXJuICh0ZW1wID4+IDE2KSAmIDB4ZmY7Cit9CisKKy8qIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHJ1bm5pbmcgb3V0IG9mIGZsYXNoLiAgZG9lc24ndCBtb2RpZnkgYW55CisgKiBnbG9iYWwgdmFyaWFibGVzIFtqb3NoXSAqLworaW50IG1wc2NfcHV0Y2hhcl9lYXJseSAoY2hhciBjaCkKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwlpbnQgbXBzYyA9IENIQU5ORUw7CisJaW50IHRlbXAgPQorCQlHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwlnYWxtcHNjX3NldF90Y3NjaGFyIChtcHNjLCBjaCk7CisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwKKwkJICAgICAgdGVtcCB8IDB4MjAwKTsKKworI2RlZmluZSBNQUdJQ19GQUNUT1IJKDEwKjEwMDAwMDApCisKKwl1ZGVsYXkgKE1BR0lDX0ZBQ1RPUiAvIGdkLT5iYXVkcmF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgaXMgdXNlZCBhZnRlciByZWxvY2F0aW9uLCBzZWUgc2VyaWFsLmMgYW5kIG1wc2NfaW5pdDIgKi8KK3N0YXRpYyBpbnQgbXBzY19wdXRjaGFyX3NkbWEgKGNoYXIgY2gpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpwOworCXVuc2lnbmVkIGludCB0ZW1wOworCisKKwkvKiBhbGlnbiB0aGUgZGVzY3JpcHRvciAqLworCXAgPSB0eF9kZXNjX2Jhc2U7CisJbWVtc2V0ICgodm9pZCAqKSBwLCAwLCA4ICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKworCS8qIGZpbGwgb25lIDY0IGJpdCBidWZmZXIgKi8KKwkvKiB3b3JkIHN3YXAsIHBhZCB3aXRoIDAgKi8KKwlwWzRdID0gMDsJCS8qIHggKi8KKwlwWzVdID0gKHVuc2lnbmVkIGludCkgY2g7CS8qIHggKi8KKworCS8qIENIQU5HRUQgY29tcGxldGVseSBhY2NvcmRpbmcgdG8gR1Q2NDI2MEEgZG94IC0gTlRMICovCisJcFswXSA9IDB4MDAwMTAwMDE7CS8qIDAgKi8KKwlwWzFdID0gREVTQ19PV05FUl9CSVQgfCBERVNDX0ZJUlNUIHwgREVTQ19MQVNUOwkvKiA0ICovCisJcFsyXSA9IDA7CQkvKiA4ICovCisJcFszXSA9ICh1bnNpZ25lZCBpbnQpICZwWzRdOwkvKiBjICovCisKKyNpZiAwCisJcFs5XSA9IERFU0NfRklSU1QgfCBERVNDX0xBU1Q7CisJcFsxMF0gPSAodW5zaWduZWQgaW50KSAmcFswXTsKKwlwWzExXSA9ICh1bnNpZ25lZCBpbnQpICZwWzEyXTsKKyNlbmRpZgorCisJRkxVU0hfRENBQ0hFICgmcFswXSwgJnBbOF0pOworCisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ1VSX1RYX1BUUiArIChDSEFOTkVMICogR0FMU0RNQV9SRUdfRElGRiksCisJCSAgICAgICh1bnNpZ25lZCBpbnQpICZwWzBdKTsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9GSVJfVFhfUFRSICsgKENIQU5ORUwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgKHVuc2lnbmVkIGludCkgJnBbMF0pOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMU0RNQV8wX0NPTV9SRUcgKyAoQ0hBTk5FTCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wIHw9IChUWF9ERU1BTkQgfCBUWF9TVE9QKTsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT01fUkVHICsgKENIQU5ORUwgKiBHQUxTRE1BX1JFR19ESUZGKSwgdGVtcCk7CisKKwlJTlZBTElEQVRFX0RDQUNIRSAoJnBbMV0sICZwWzJdKTsKKworCXdoaWxlIChwWzFdICYgREVTQ19PV05FUl9CSVQpIHsKKwkJdWRlbGF5ICgxMDApOworCQlJTlZBTElEQVRFX0RDQUNIRSAoJnBbMV0sICZwWzJdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgbXBzY19nZXRjaGFyX3NkbWEgKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBkb25lID0gMDsKKwl2b2xhdGlsZSBjaGFyIGNoOworCXVuc2lnbmVkIGludCBsZW4gPSAwLCBpZHggPSAwLCB0ZW1wOworCisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICpwOworCisKKwlkbyB7CisJCXAgPSAmcnhfZGVzY19iYXNlW3J4X2Rlc2NfaW5kZXggKiA4XTsKKworCQlJTlZBTElEQVRFX0RDQUNIRSAoJnBbMF0sICZwWzFdKTsKKwkJLyogV2FpdCBmb3IgY2hhcmFjdGVyICovCisJCXdoaWxlIChwWzFdICYgREVTQ19PV05FUl9CSVQpIHsKKwkJCXVkZWxheSAoMTAwKTsKKwkJCUlOVkFMSURBVEVfRENBQ0hFICgmcFswXSwgJnBbMV0pOworCQl9CisKKwkJLyogSGFuZGxlIGVycm9yIGNhc2UgKi8KKwkJaWYgKHBbMV0gJiAoMSA8PCAxNSkpIHsKKwkJCXByaW50ZiAoIm9vcHMsIGVycm9yOiAlMDh4XG4iLCBwWzFdKTsKKworCQkJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKworCQkJCQkgIChDSEFOTkVMICogR0FMTVBTQ19SRUdfR0FQKSk7CisJCQl0ZW1wIHw9ICgxIDw8IDIzKTsKKwkJCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKworCQkJCSAgICAgIChDSEFOTkVMICogR0FMTVBTQ19SRUdfR0FQKSwgdGVtcCk7CisKKwkJCS8qIENhbid0IHBvbGwgb24gYWJvcnQgYml0LCBzbyB3ZSBqdXN0IHdhaXQuICovCisJCQl1ZGVsYXkgKDEwMCk7CisKKwkJCWdhbHNkbWFfZW5hYmxlX3J4ICgpOworCQl9CisKKwkJLyogTnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gdGhpcyBkZXNjcmlwdG9yICovCisJCWxlbiA9IHBbMF0gJiAweGZmZmY7CisKKwkJaWYgKGxlbikgeworCQkJLyogV2hlcmUgdG8gbG9vayAqLworCQkJaWR4ID0gNTsKKwkJCWlmIChkb25lID4gMykKKwkJCQlpZHggPSA0OworCQkJaWYgKGRvbmUgPiA3KQorCQkJCWlkeCA9IDc7CisJCQlpZiAoZG9uZSA+IDExKQorCQkJCWlkeCA9IDY7CisKKwkJCUlOVkFMSURBVEVfRENBQ0hFICgmcFtpZHhdLCAmcFtpZHggKyAxXSk7CisJCQljaCA9IHBbaWR4XSAmIDB4ZmY7CisJCQlkb25lKys7CisJCX0KKworCQlpZiAoZG9uZSA8IGxlbikgeworCQkJLyogdGhpcyBkZXNjcmlwdG9yIGhhcyBtb3JlIGJ5dGVzIHN0aWxsCisJCQkgKiBzaGlmdCBkb3duIHRoZSBjaGFyIHdlIGp1c3QgcmVhZCwgYW5kIGxlYXZlIHRoZQorCQkJICogYnVmZmVyIGluIHBsYWNlIGZvciB0aGUgbmV4dCB0aW1lIGFyb3VuZAorCQkJICovCisJCQlwW2lkeF0gPSBwW2lkeF0gPj4gODsKKwkJCUZMVVNIX0RDQUNIRSAoJnBbaWR4XSwgJnBbaWR4ICsgMV0pOworCQl9CisKKwkJaWYgKGRvbmUgPT0gbGVuKSB7CisJCQkvKiBub3RoaW5nIGxlZnQgaW4gdGhpcyBkZXNjcmlwdG9yLgorCQkJICogZ28gdG8gbmV4dCBvbmUKKwkJCSAqLworCQkJcFsxXSA9IERFU0NfT1dORVJfQklUIHwgREVTQ19GSVJTVCB8IERFU0NfTEFTVDsKKwkJCXBbMF0gPSAweDAwMTAwMDAwOworCQkJRkxVU0hfRENBQ0hFICgmcFswXSwgJnBbMV0pOworCQkJLyogTmV4dCBkZXNjcmlwdG9yICovCisJCQlyeF9kZXNjX2luZGV4ID0gKHJ4X2Rlc2NfaW5kZXggKyAxKSAlIFJYX0RFU0M7CisJCQlkb25lID0gMDsKKwkJfQorCX0gd2hpbGUgKGxlbiA9PSAwKTsJLyogZ2FsaWxlbyBidWcuLiBsZW4gbWlnaHQgYmUgemVybyAqLworCisJcmV0dXJuIGNoOworfQorCisKK2ludCBtcHNjX3Rlc3RfY2hhcl9kZWJ1ZyAodm9pZCkKK3sKKwlpZiAoKEdUUkVHUkVBRCAoR0FMTVBTQ18wX0lOVF9DQVVTRSkgJiBCSVQ2KSA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJcmV0dXJuIDE7CisJfQorfQorCisKK2ludCBtcHNjX3Rlc3RfY2hhcl9zZG1hICh2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqcCA9ICZyeF9kZXNjX2Jhc2VbcnhfZGVzY19pbmRleCAqIDhdOworCisJSU5WQUxJREFURV9EQ0FDSEUgKCZwWzFdLCAmcFsyXSk7CisKKwlpZiAocFsxXSAmIERFU0NfT1dORVJfQklUKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCitpbnQgbXBzY19pbml0IChpbnQgYmF1ZCkKK3sKKwkvKiBCUkcgQ09ORklHICovCisJZ2FsYnJnX3NldF9iYXVkcmF0ZSAoQ0hBTk5FTCwgYmF1ZCk7CisJZ2FsYnJnX3NldF9jbGtzcmMgKENIQU5ORUwsIDgpOwkvKiBzZXQgc291cmNlPVRjbGsgKi8KKwlnYWxicmdfc2V0X0NVViAoQ0hBTk5FTCwgMCk7CS8qIHNldCB1cCBDb3VudFVwVmFsdWUgKi8KKwlnYWxicmdfZW5hYmxlIChDSEFOTkVMKTsJLyogRW5hYmxlIEJSRyAqLworCisJLyogU2V0IHVwIGNsb2NrIHJvdXRpbmcgKi8KKwlnYWxtcHNjX2Nvbm5lY3QgKENIQU5ORUwsIEdBTE1QU0NfQ09OTkVDVCk7CS8qIGNvbm5lY3QgaXQgKi8KKworCWdhbG1wc2Nfcm91dGVfcnhfY2xvY2sgKENIQU5ORUwsIENIQU5ORUwpOwkvKiBjaG9zc2UgQlJHMCBmb3IgUnggKi8KKwlnYWxtcHNjX3JvdXRlX3R4X2Nsb2NrIChDSEFOTkVMLCBDSEFOTkVMKTsJLyogY2hvc2UgQlJHMCBmb3IgVHggKi8KKworCS8qIHJlc2V0IE1QU0Mgc3RhdGUgKi8KKwlnYWxtcHNjX3NodXRkb3duIChDSEFOTkVMKTsKKworCS8qIFNETUEgQ09ORklHICovCisJZ2Fsc2RtYV9zZXRfYnVyc3RzaXplIChDSEFOTkVMLCBMMV9DQUNIRV9CWVRFUyAvIDgpOwkvKiBpbiA2NCBiaXQgd29yZHMgKDggYnl0ZXMpICovCisJZ2Fsc2RtYV9zZXRfdHhsZSAoQ0hBTk5FTCk7CisJZ2Fsc2RtYV9zZXRfcnhsZSAoQ0hBTk5FTCk7CisJZ2Fsc2RtYV9zZXRfUkMgKENIQU5ORUwsIDB4Zik7CisJZ2Fsc2RtYV9zZXRfU0ZNIChDSEFOTkVMKTsKKwlnYWxzZG1hX3NldF9SRlQgKENIQU5ORUwpOworCisJLyogTVBTQyBDT05GSUcgKi8KKwlnYWxtcHNjX3dyaXRlX2NvbmZpZ19yZWdzIChDSEFOTkVMLCBHQUxNUFNDX1VBUlQpOworCWdhbG1wc2NfY29uZmlnX2NoYW5uZWxfcmVncyAoQ0hBTk5FTCk7CisJZ2FsbXBzY19zZXRfY2hhcl9sZW5ndGggKENIQU5ORUwsIEdBTE1QU0NfQ0hBUl9MRU5HVEhfOCk7CS8qIDggKi8KKwlnYWxtcHNjX3NldF9wYXJpdHkgKENIQU5ORUwsIEdBTE1QU0NfUEFSSVRZX05PTkUpOwkvKiBOICovCisJZ2FsbXBzY19zZXRfc3RvcF9iaXRfbGVuZ3RoIChDSEFOTkVMLCBHQUxNUFNDX1NUT1BfQklUU18xKTsJLyogMSAqLworCisjaWZkZWYgQ09ORklHX01QU0NfREVCVUdfUE9SVAorCW1wc2NfZGVidWdfaW5pdCAoKTsKKyNlbmRpZgorCisJLyogQ09NTV9NUFNDIENPTkZJRyAqLworI2lmZGVmIFNPRlRXQVJFX0NBQ0hFX01BTkFHRU1FTlQKKwlnYWxtcHNjX3NldF9zbm9vcCAoQ0hBTk5FTCwgMCk7CS8qIGRpc2FibGUgc25vb3AgKi8KKyNlbHNlCisJZ2FsbXBzY19zZXRfc25vb3AgKENIQU5ORUwsIDEpOwkvKiBlbmFibGUgc25vb3AgKi8KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBtcHNjX3NkbWFfaW5pdCAodm9pZCkKK3sKKy8qIFNldHVwIFNETUEgY2hhbm5lbDAgU0RNQV9DT05GSUdfUkVHKi8KKwlHVF9SRUdfV1JJVEUgKFNETUFfQ09ORklHX1JFRyAoMCksIDB4MDAwMDIwZmYpOworCisvKiAgRW5hYmxlIE1QU0MtV2luZG93MCBmb3IgRFJBTSBCYW5rMCAgICovCisJaWYgKGdhbHNkbWFfc2V0X21lbV9zcGFjZSAoTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzBfQklULAorCQkJCSAgIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzBfVEFSR0VULAorCQkJCSAgIDAsCisJCQkJICAgbWVtb3J5R2V0QmFua0Jhc2VBZGRyZXNzCisJCQkJICAgKENTXzBfTE9XX0RFQ09ERV9BRERSRVNTKSwKKwkJCQkgICBtZW1vcnlHZXRCYW5rU2l6ZSAoQkFOSzApKSAhPSB0cnVlKQorCQlwcmludGYgKCIlczogU0RNQV9XaW5kb3cwIG1lbW9yeSBzZXR1cCBmYWlsZWQgISEhIFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKworLyogIERpc2FibGUgTVBTQy1XaW5kb3cxICAgICovCisJaWYgKGdhbHNkbWFfc2V0X21lbV9zcGFjZSAoTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzFfQklULAorCQkJCSAgIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzBfVEFSR0VULAorCQkJCSAgIDAsCisJCQkJICAgbWVtb3J5R2V0QmFua0Jhc2VBZGRyZXNzCisJCQkJICAgKENTXzFfTE9XX0RFQ09ERV9BRERSRVNTKSwKKwkJCQkgICBtZW1vcnlHZXRCYW5rU2l6ZSAoQkFOSzMpKSAhPSB0cnVlKQorCQlwcmludGYgKCIlczogU0RNQV9XaW5kb3cxIG1lbW9yeSBzZXR1cCBmYWlsZWQgISEhIFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKworLyogIERpc2FibGUgTVBTQy1XaW5kb3cyICovCisJaWYgKGdhbHNkbWFfc2V0X21lbV9zcGFjZSAoTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzJfQklULAorCQkJCSAgIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzBfVEFSR0VULAorCQkJCSAgIDAsCisJCQkJICAgbWVtb3J5R2V0QmFua0Jhc2VBZGRyZXNzCisJCQkJICAgKENTXzJfTE9XX0RFQ09ERV9BRERSRVNTKSwKKwkJCQkgICBtZW1vcnlHZXRCYW5rU2l6ZSAoQkFOSzMpKSAhPSB0cnVlKQorCQlwcmludGYgKCIlczogU0RNQV9XaW5kb3cyIG1lbW9yeSBzZXR1cCBmYWlsZWQgISEhIFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKworLyogIERpc2FibGUgTVBTQy1XaW5kb3czICovCisJaWYgKGdhbHNkbWFfc2V0X21lbV9zcGFjZSAoTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzNfQklULAorCQkJCSAgIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzBfVEFSR0VULAorCQkJCSAgIDAsCisJCQkJICAgbWVtb3J5R2V0QmFua0Jhc2VBZGRyZXNzCisJCQkJICAgKENTXzNfTE9XX0RFQ09ERV9BRERSRVNTKSwKKwkJCQkgICBtZW1vcnlHZXRCYW5rU2l6ZSAoQkFOSzMpKSAhPSB0cnVlKQorCQlwcmludGYgKCIlczogU0RNQV9XaW5kb3czIG1lbW9yeSBzZXR1cCBmYWlsZWQgISEhIFxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisKKy8qICBTZXR1cCBNUFNDMCBhY2Nlc3MgbW9kZSBXaW5kb3cwIGZ1bGwgYWNjZXNzICovCisJR1RfU0VUX1JFR19CSVRTIChNUFNDMF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcsCisJCQkgKE1WNjQ0NjBfU0RNQV9XSU5fQUNDRVNTX0ZVTEwgPDwKKwkJCSAgKE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX1dJTl8wX0JJVCAqIDIpKSk7CisKKy8qICBTZXR1cCBNUFNDMSBhY2Nlc3MgbW9kZSBXaW5kb3cxIGZ1bGwgYWNjZXNzICovCisJR1RfU0VUX1JFR19CSVRTIChNUFNDMV9BQ0NFU1NfUFJPVEVDVElPTl9SRUcsCisJCQkgKE1WNjQ0NjBfU0RNQV9XSU5fQUNDRVNTX0ZVTEwgPDwKKwkJCSAgKE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX1dJTl8wX0JJVCAqIDIpKSk7CisKKy8qIFNldHVwIE1QU0MgaW50ZXJuYWwgYWRkcmVzcyBzcGFjZSBiYXNlIGFkZHJlc3MgCSovCisJR1RfUkVHX1dSSVRFIChDVU5JVF9JTlRFUk5BTF9TUEFDRV9CQVNFX0FERFJfUkVHLCBDRkdfR1RfUkVHUyk7CisKKy8qIG5vIGhpZ2ggYWRkcmVzcyByZW1hcCovCisJR1RfUkVHX1dSSVRFIChDVU5JVF9ISUdIX0FERFJfUkVNQVBfUkVHMCwgMHgwMCk7CisJR1RfUkVHX1dSSVRFIChDVU5JVF9ISUdIX0FERFJfUkVNQVBfUkVHMSwgMHgwMCk7CisKKy8qIGNsZWFyIGludGVycnVwdCBjYXVzZSByZWdpc3RlciBmb3IgTVBTQyAoZmF1bHQgcmVnaXN0ZXIpKi8KKwlHVF9SRUdfV1JJVEUgKENVTklUX0lOVEVSUlVQVF9DQVVTRV9SRUcsIDB4MDApOworfQorCisKK3ZvaWQgbXBzY19pbml0MiAodm9pZCkKK3sKKwlpbnQgaTsKKworI2lmbmRlZiBDT05GSUdfTVBTQ19ERUJVR19QT1JUCisJbXBzY19wdXRjaGFyID0gbXBzY19wdXRjaGFyX3NkbWE7CisJbXBzY19nZXRjaGFyID0gbXBzY19nZXRjaGFyX3NkbWE7CisJbXBzY190ZXN0X2NoYXIgPSBtcHNjX3Rlc3RfY2hhcl9zZG1hOworI2VuZGlmCisJLyogUlggZGVzY3JpcHRvcnMgKi8KKwlyeF9kZXNjX2Jhc2UgPSAodW5zaWduZWQgaW50ICopIG1hbGxvYyAoKChSWF9ERVNDICsgMSkgKiA4KSAqCisJCQkJCQlzaXplb2YgKHVuc2lnbmVkIGludCkpOworCisJLyogYWxpZ24gZGVzY3JpcHRvcnMgKi8KKwlyeF9kZXNjX2Jhc2UgPSAodW5zaWduZWQgaW50ICopCisJCSgoKHVuc2lnbmVkIGludCkgcnhfZGVzY19iYXNlICsgMzIpICYgMHhGRkZGRkZGMCk7CisKKwlyeF9kZXNjX2luZGV4ID0gMDsKKworCW1lbXNldCAoKHZvaWQgKikgcnhfZGVzY19iYXNlLCAwLAorCQkoUlhfREVTQyAqIDgpICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9ERVNDOyBpKyspIHsKKwkJcnhfZGVzY19iYXNlW2kgKiA4ICsgM10gPSAodW5zaWduZWQgaW50KSAmcnhfZGVzY19iYXNlW2kgKiA4ICsgNF07CS8qIEJ1ZmZlciAqLworCQlyeF9kZXNjX2Jhc2VbaSAqIDggKyAyXSA9ICh1bnNpZ25lZCBpbnQpICZyeF9kZXNjX2Jhc2VbKGkgKyAxKSAqIDhdOwkvKiBOZXh0IGRlc2NyaXB0b3IgKi8KKwkJcnhfZGVzY19iYXNlW2kgKiA4ICsgMV0gPSBERVNDX09XTkVSX0JJVCB8IERFU0NfRklSU1QgfCBERVNDX0xBU1Q7CS8qIENvbW1hbmQgJiBjb250cm9sICovCisJCXJ4X2Rlc2NfYmFzZVtpICogOF0gPSAweDAwMTAwMDAwOworCX0KKwlyeF9kZXNjX2Jhc2VbKGkgLSAxKSAqIDggKyAyXSA9ICh1bnNpZ25lZCBpbnQpICZyeF9kZXNjX2Jhc2VbMF07CisKKwlGTFVTSF9EQ0FDSEUgKCZyeF9kZXNjX2Jhc2VbMF0sICZyeF9kZXNjX2Jhc2VbUlhfREVTQyAqIDhdKTsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DVVJfUlhfUFRSICsgKENIQU5ORUwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgKHVuc2lnbmVkIGludCkgJnJ4X2Rlc2NfYmFzZVswXSk7CisKKwkvKiBUWCBkZXNjcmlwdG9ycyAqLworCXR4X2Rlc2NfYmFzZSA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jICgoKFRYX0RFU0MgKyAxKSAqIDgpICoKKwkJCQkJCXNpemVvZiAodW5zaWduZWQgaW50KSk7CisKKwkvKiBhbGlnbiBkZXNjcmlwdG9ycyAqLworCXR4X2Rlc2NfYmFzZSA9ICh1bnNpZ25lZCBpbnQgKikKKwkJKCgodW5zaWduZWQgaW50KSB0eF9kZXNjX2Jhc2UgKyAzMikgJiAweEZGRkZGRkYwKTsKKworCXR4X2Rlc2NfaW5kZXggPSAtMTsKKworCW1lbXNldCAoKHZvaWQgKikgdHhfZGVzY19iYXNlLCAwLAorCQkoVFhfREVTQyAqIDgpICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9ERVNDOyBpKyspIHsKKwkJdHhfZGVzY19iYXNlW2kgKiA4ICsgNV0gPSAodW5zaWduZWQgaW50KSAweDIzMjMyMzIzOworCQl0eF9kZXNjX2Jhc2VbaSAqIDggKyA0XSA9ICh1bnNpZ25lZCBpbnQpIDB4MjMyMzIzMjM7CisJCXR4X2Rlc2NfYmFzZVtpICogOCArIDNdID0KKwkJCSh1bnNpZ25lZCBpbnQpICZ0eF9kZXNjX2Jhc2VbaSAqIDggKyA0XTsKKwkJdHhfZGVzY19iYXNlW2kgKiA4ICsgMl0gPQorCQkJKHVuc2lnbmVkIGludCkgJnR4X2Rlc2NfYmFzZVsoaSArIDEpICogOF07CisJCXR4X2Rlc2NfYmFzZVtpICogOCArIDFdID0KKwkJCURFU0NfT1dORVJfQklUIHwgREVTQ19GSVJTVCB8IERFU0NfTEFTVDsKKworCQkvKiBzZXQgc2J5dGVjbnQgYW5kIHNoYWRvdyBieXRlIGNudCB0byAxICovCisJCXR4X2Rlc2NfYmFzZVtpICogOF0gPSAweDAwMDEwMDAxOworCX0KKwl0eF9kZXNjX2Jhc2VbKGkgLSAxKSAqIDggKyAyXSA9ICh1bnNpZ25lZCBpbnQpICZ0eF9kZXNjX2Jhc2VbMF07CisKKwlGTFVTSF9EQ0FDSEUgKCZ0eF9kZXNjX2Jhc2VbMF0sICZ0eF9kZXNjX2Jhc2VbVFhfREVTQyAqIDhdKTsKKworCXVkZWxheSAoMTAwKTsKKworCWdhbHNkbWFfZW5hYmxlX3J4ICgpOworCisJcmV0dXJuOworfQorCitpbnQgZ2FsYnJnX3NldF9iYXVkcmF0ZSAoaW50IGNoYW5uZWwsIGludCByYXRlKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCWludCBjbG9jazsKKworCWdhbGJyZ19kaXNhYmxlIChjaGFubmVsKTsJLypvayAqLworCisjaWZkZWYgWlVNQV9OVEwKKwkvKiBmcm9tIHRjbGsgKi8KKwljbG9jayA9IChDRkdfVENMSyAvICgxNiAqIHJhdGUpKSAtIDE7CisjZWxzZQorCWNsb2NrID0gKENGR19UQ0xLIC8gKDE2ICogcmF0ZSkpIC0gMTsKKyNlbmRpZgorCisJZ2FsYnJnX3NldF9DRFYgKGNoYW5uZWwsIGNsb2NrKTsJLyogc2V0IHRpbWVyIFJlZy4gZm9yIEJSRyAqLworCisJZ2FsYnJnX2VuYWJsZSAoY2hhbm5lbCk7CisKKwlnZC0+YmF1ZHJhdGUgPSByYXRlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBCZWxvdyBhcmUgYWxsIHRoZSBwcml2YXRlIGZ1bmN0aW9ucyB0aGF0IG5vIG9uZSBlbHNlIG5lZWRzICovCisKK3N0YXRpYyBpbnQgZ2FsYnJnX3NldF9DRFYgKGludCBjaGFubmVsLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCkpOworCXRlbXAgJj0gMHhGRkZGMDAwMDsKKwl0ZW1wIHw9ICh2YWx1ZSAmIDB4MDAwMEZGRkYpOworCUdUX1JFR19XUklURSAoR0FMQlJHXzBfQ09ORlJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbGJyZ19lbmFibGUgKGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMQlJHXzBfQ09ORlJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApKTsKKwl0ZW1wIHw9IDB4MDAwMTAwMDA7CisJR1RfUkVHX1dSSVRFIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsYnJnX2Rpc2FibGUgKGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMQlJHXzBfQ09ORlJFRyArIChjaGFubmVsICogR0FMQlJHX1JFR19HQVApKTsKKwl0ZW1wICY9IDB4RkZGRUZGRkY7CisJR1RfUkVHX1dSSVRFIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsYnJnX3NldF9jbGtzcmMgKGludCBjaGFubmVsLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCkpOworCXRlbXAgJj0gMHhGRkMzRkZGRjsJLyogQml0IDE4IC0gMjEgKE1WIDY0MjYwIDE4LTIyKSAqLworCXRlbXAgfD0gKHZhbHVlIDw8IDE4KTsKKwlHVF9SRUdfV1JJVEUgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSwgdGVtcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsYnJnX3NldF9DVVYgKGludCBjaGFubmVsLCBpbnQgdmFsdWUpCit7CisJLyogc2V0IENvdW50VXBWYWx1ZSAqLworCUdUX1JFR19XUklURSAoR0FMQlJHXzBfQlRSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IGdhbGJyZ19yZXNldCAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxCUkdfMF9DT05GUkVHICsgKGNoYW5uZWwgKiBHQUxCUkdfUkVHX0dBUCkpOworCXRlbXAgfD0gMHgyMDAwMDsKKwlHVF9SRUdfV1JJVEUgKEdBTEJSR18wX0NPTkZSRUcgKyAoY2hhbm5lbCAqIEdBTEJSR19SRUdfR0FQKSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X1JGVCAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wIHw9IDB4MDAwMDAwMDE7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X1NGTSAoaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wIHw9IDB4MDAwMDAwMDI7CisJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkgICAgICB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbHNkbWFfc2V0X3J4bGUgKGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMU0RNQV8wX0NPTkZfUkVHICsgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSk7CisJdGVtcCB8PSAweDAwMDAwMDQwOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHICsgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxzZG1hX3NldF90eGxlIChpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgfD0gMHgwMDAwMDA4MDsKKwlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRiksCisJCSAgICAgIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Fsc2RtYV9zZXRfUkMgKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wICY9IH4weDAwMDAwMDNjOworCXRlbXAgfD0gKHZhbHVlIDw8IDIpOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHICsgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJICAgICAgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxzZG1hX3NldF9idXJzdHNpemUgKGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09ORl9SRUcgKyAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpKTsKKwl0ZW1wICY9IDB4RkZGRkNGRkY7CisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgODoKKwkJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKworCQkJICAgICAgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJCSAgICAgICh0ZW1wIHwgKDB4MyA8PCAxMikpKTsKKwkJYnJlYWs7CisKKwljYXNlIDQ6CisJCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHICsKKwkJCSAgICAgIChjaGFubmVsICogR0FMU0RNQV9SRUdfRElGRiksCisJCQkgICAgICAodGVtcCB8ICgweDIgPDwgMTIpKSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlHVF9SRUdfV1JJVEUgKEdBTFNETUFfMF9DT05GX1JFRyArCisJCQkgICAgICAoY2hhbm5lbCAqIEdBTFNETUFfUkVHX0RJRkYpLAorCQkJICAgICAgKHRlbXAgfCAoMHgxIDw8IDEyKSkpOworCQlicmVhazsKKworCWNhc2UgMToKKwkJR1RfUkVHX1dSSVRFIChHQUxTRE1BXzBfQ09ORl9SRUcgKworCQkJICAgICAgKGNoYW5uZWwgKiBHQUxTRE1BX1JFR19ESUZGKSwKKwkJCSAgICAgICh0ZW1wIHwgKDB4MCA8PCAxMikpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2NfY29ubmVjdCAoaW50IGNoYW5uZWwsIGludCBjb25uZWN0KQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19ST1VUSU5HX1JFR0lTVEVSKTsKKworCWlmICgoY2hhbm5lbCA9PSAwKSAmJiBjb25uZWN0KQorCQl0ZW1wICY9IH4weDAwMDAwMDA3OworCWVsc2UgaWYgKChjaGFubmVsID09IDEpICYmIGNvbm5lY3QpCisJCXRlbXAgJj0gfigweDAwMDAwMDA3IDw8IDYpOworCWVsc2UgaWYgKChjaGFubmVsID09IDApICYmICFjb25uZWN0KQorCQl0ZW1wIHw9IDB4MDAwMDAwMDc7CisJZWxzZQorCQl0ZW1wIHw9ICgweDAwMDAwMDA3IDw8IDYpOworCisJLyogSnVzdCBpbiBjYXNlLi4uICovCisJdGVtcCAmPSAweDNmZmZmZmZmOworCisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX1JPVVRJTkdfUkVHSVNURVIsIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19yb3V0ZV9yeF9jbG9jayAoaW50IGNoYW5uZWwsIGludCBicmcpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX1J4Q19ST1VURSk7CisKKwlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCXRlbXAgJj0gfjB4MDAwMDAwMEY7CisJCXRlbXAgfD0gYnJnOworCX0gZWxzZSB7CisJCXRlbXAgJj0gfjB4MDAwMDBGMDA7CisJCXRlbXAgfD0gKGJyZyA8PCA4KTsKKwl9CisKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfUnhDX1JPVVRFLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfcm91dGVfdHhfY2xvY2sgKGludCBjaGFubmVsLCBpbnQgYnJnKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19UeENfUk9VVEUpOworCisJaWYgKGNoYW5uZWwgPT0gMCkgeworCQl0ZW1wICY9IH4weDAwMDAwMDBGOworCQl0ZW1wIHw9IGJyZzsKKwl9IGVsc2UgeworCQl0ZW1wICY9IH4weDAwMDAwRjAwOworCQl0ZW1wIHw9IChicmcgPDwgOCk7CisJfQorCisJR1RfUkVHX1dSSVRFIChHQUxNUFNDX1R4Q19ST1VURSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxtcHNjX3dyaXRlX2NvbmZpZ19yZWdzIChpbnQgbXBzYywgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgPT0gR0FMTVBTQ19VQVJUKSB7CisJCS8qIE1haW4gY29uZmlnIHJlZyBMb3cgKE51bGwgbW9kZW0sIEVuYWJsZSBUeC9SeCwgVUFSVCBtb2RlKSAqLworCQlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfTUNPTkZfTE9XICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLAorCQkJICAgICAgMHgwMDAwMDRjNCk7CisKKwkJLyogTWFpbiBjb25maWcgcmVnIEhpZ2ggKDMyeCBSeC9UeCBjbG9jayBtb2RlLCB3aWR0aD04Yml0cyAqLworCQlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfTUNPTkZfSElHSCArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwKKwkJCSAgICAgIDB4MDI0MDAzZjgpOworCQkvKiAgICAgICAgMjIgMjIyMiAxMTExICovCisJCS8qICAgICAgICA1NCAzMjEwIDk4NzYgKi8KKwkJLyogMDAwMCAwMDEwIDAwMDAgMDAwMCAqLworCQkvKiAgICAgICAxICovCisJCS8qICAgICAgIDA5OCA3NjU0IDMyMTAgKi8KKwkJLyogMDAwMCAwMDExIDExMTEgMTAwMCAqLworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxtcHNjX2NvbmZpZ19jaGFubmVsX3JlZ3MgKGludCBtcHNjKQoreworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzEgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzMgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDEpOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzQgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzUgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzYgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzcgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzggKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzkgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzEwICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCAwKTsKKworCWdhbG1wc2Nfc2V0X2Jya2NudCAobXBzYywgMHgzKTsKKwlnYWxtcHNjX3NldF90Y3NjaGFyIChtcHNjLCAweGFiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X2Jya2NudCAoaW50IG1wc2MsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18xICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wICY9IDB4MDAwMEZGRkY7CisJdGVtcCB8PSAodmFsdWUgPDwgMTYpOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzEgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfdGNzY2hhciAoaW50IG1wc2MsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18xICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wICY9IDB4RkZGRjAwMDA7CisJdGVtcCB8PSB2YWx1ZTsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR18xICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X2NoYXJfbGVuZ3RoIChpbnQgbXBzYywgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJdGVtcCA9IEdUUkVHUkVBRCAoR0FMTVBTQ19QUk9UT0NPTkZfUkVHICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wICY9IDB4RkZGRkNGRkY7CisJdGVtcCB8PSAodmFsdWUgPDwgMTIpOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19QUk9UT0NPTkZfUkVHICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2Nfc2V0X3N0b3BfYml0X2xlbmd0aCAoaW50IG1wc2MsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfUFJPVE9DT05GX1JFRyArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSk7CisJdGVtcCAmPSAweEZGRkZCRkZGOworCXRlbXAgfD0gKHZhbHVlIDw8IDE0KTsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfUFJPVE9DT05GX1JFRyArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYWxtcHNjX3NldF9wYXJpdHkgKGludCBtcHNjLCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSk7CisJaWYgKHZhbHVlICE9IC0xKSB7CisJCXRlbXAgJj0gMHhGRkYzRkZGMzsKKwkJdGVtcCB8PSAoKHZhbHVlIDw8IDE4KSB8ICh2YWx1ZSA8PCAyKSk7CisJCXRlbXAgfD0gKCh2YWx1ZSA8PCAxNykgfCAodmFsdWUgPDwgMSkpOworCX0gZWxzZSB7CisJCXRlbXAgJj0gMHhGRkYxRkZGMTsKKwl9CisKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdhbG1wc2NfZW50ZXJfaHVudCAoaW50IG1wc2MpCit7CisJaW50IHRlbXA7CisKKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxNUFNDX0NIQU5ORUxSRUdfMiArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSk7CisJdGVtcCB8PSAweDgwMDAwMDAwOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCksIHRlbXApOworCisJd2hpbGUgKEdUUkVHUkVBRCAoR0FMTVBTQ19DSEFOTkVMUkVHXzIgKyAobXBzYyAqIEdBTE1QU0NfUkVHX0dBUCkpICYKKwkgICAgICAgTVBTQ19FTlRFUl9IVU5UKSB7CisJCXVkZWxheSAoMSk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zaHV0ZG93biAoaW50IG1wc2MpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisKKwkvKiBjYXVzZSBSWCBhYm9ydCAoY2xlYXJzIFJYKSAqLworCXRlbXAgPSBHVFJFR1JFQUQgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApKTsKKwl0ZW1wIHw9IE1QU0NfUlhfQUJPUlQgfCBNUFNDX1RYX0FCT1JUOworCXRlbXAgJj0gfk1QU0NfRU5URVJfSFVOVDsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfQ0hBTk5FTFJFR18yICsgKG1wc2MgKiBHQUxNUFNDX1JFR19HQVApLCB0ZW1wKTsKKworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTV9SRUcsIDApOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTV9SRUcsIFNETUFfVFhfQUJPUlQgfCBTRE1BX1JYX0FCT1JUKTsKKworCS8qIHNodXQgZG93biB0aGUgTVBTQyAqLworCUdUX1JFR19XUklURSAoR0FMTVBTQ19NQ09ORl9MT1csIDApOworCUdUX1JFR19XUklURSAoR0FMTVBTQ19NQ09ORl9ISUdILCAwKTsKKwlHVF9SRUdfV1JJVEUgKEdBTE1QU0NfUFJPVE9DT05GX1JFRyArIChtcHNjICogR0FMTVBTQ19SRUdfR0FQKSwgMCk7CisKKwl1ZGVsYXkgKDEwMCk7CisKKwkvKiBzaHV0IGRvd24gdGhlIHNkbWEgZW5naW5lcy4gKi8KKwkvKiByZXNldCBjb25maWcgdG8gZGVmYXVsdCAqLworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTkZfUkVHLCAweDAwMDAwMGZjKTsKKworCXVkZWxheSAoMTAwKTsKKworCS8qIGNsZWFyIHRoZSBTRE1BIGN1cnJlbnQgYW5kIGZpcnN0IFRYIGFuZCBSWCBwb2ludGVycyAqLworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NVUl9SWF9QVFIsIDApOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NVUl9UWF9QVFIsIDApOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0ZJUl9UWF9QVFIsIDApOworCisJdWRlbGF5ICgxMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdhbHNkbWFfZW5hYmxlX3J4ICh2b2lkKQoreworCWludCB0ZW1wOworCisJLyogRW5hYmxlIFJYIHByb2Nlc3NpbmcgKi8KKwl0ZW1wID0gR1RSRUdSRUFEIChHQUxTRE1BXzBfQ09NX1JFRyArIChDSEFOTkVMICogR0FMU0RNQV9SRUdfRElGRikpOworCXRlbXAgfD0gUlhfRU5BQkxFOworCUdUX1JFR19XUklURSAoR0FMU0RNQV8wX0NPTV9SRUcgKyAoQ0hBTk5FTCAqIEdBTFNETUFfUkVHX0RJRkYpLCB0ZW1wKTsKKworCWdhbG1wc2NfZW50ZXJfaHVudCAoQ0hBTk5FTCk7Cit9CisKK3N0YXRpYyBpbnQgZ2FsbXBzY19zZXRfc25vb3AgKGludCBtcHNjLCBpbnQgdmFsdWUpCit7CisJaW50IHJlZyA9CisJCW1wc2MgPyBNUFNDXzFfQUREUkVTU19DT05UUk9MX0xPVyA6CisJCU1QU0NfMF9BRERSRVNTX0NPTlRST0xfTE9XOworCWludCB0ZW1wID0gR1RSRUdSRUFEIChyZWcpOworCisJaWYgKHZhbHVlKQorCQl0ZW1wIHw9ICgxIDw8IDYpIHwgKDEgPDwgMTQpIHwgKDEgPDwgMjIpIHwgKDEgPDwgMzApOworCWVsc2UKKwkJdGVtcCAmPSB+KCgxIDw8IDYpIHwgKDEgPDwgMTQpIHwgKDEgPDwgMjIpIHwgKDEgPDwgMzApKTsKKwlHVF9SRUdfV1JJVEUgKHJlZywgdGVtcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGdhbHNkbWFfc2V0X21lbV9zcGFjZSAtIFNldCBNVjY0NDYwIElETUEgbWVtb3J5IGRlY29kaW5nIG1hcC4KKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIHRoZSBNVjY0NDYwIFNETUEgaGFzIGl0cyBvd24gYWRkcmVzcyBkZWNvZGluZyBtYXAgdGhhdCBpcyBkZS1jb3VwbGVkCisqICAgICAgIGZyb20gdGhlIENQVSBpbnRlcmZhY2UgYWRkcmVzcyBkZWNvZGluZyB3aW5kb3dzLiBUaGUgU0RNQSBjaGFubmVscworKiAgICAgICBzaGFyZSBmb3VyIGFkZHJlc3Mgd2luZG93cy4gRWFjaCByZWdpb24gY2FuIGJlIGluZGl2aWR1YWxseSBjb25maWd1cmVkCisqICAgICAgIGJ5IHRoaXMgZnVuY3Rpb24gYnkgYXNzb2NpYXRpbmcgaXQgdG8gYSB0YXJnZXQgaW50ZXJmYWNlIGFuZCBzZXR0aW5nCisqICAgICAgIGJhc2UgYW5kIHNpemUgdmFsdWVzLgorKgorKiAgICAgIE5PVEUhISEKKyogICAgICAgVGhlIHNpemUgbXVzdCBiZSBpbiA2NEtieXRlIGdyYW51bGFyaXR5LgorKiAgICAgICBUaGUgYmFzZSBhZGRyZXNzIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2l6ZS4KKyogICAgICAgVGhlIHNpemUgbXVzdCBiZSBhIHNlcmllcyBvZiAxcyBmb2xsb3dlZCBieSBhIHNlcmllcyBvZiB6ZXJvcworKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgVHJ1ZSBmb3Igc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBnYWxzZG1hX3NldF9tZW1fc3BhY2UgKHVuc2lnbmVkIGludCBtZW1TcGFjZSwKKwkJCQkgIHVuc2lnbmVkIGludCBtZW1TcGFjZVRhcmdldCwKKwkJCQkgIHVuc2lnbmVkIGludCBtZW1TcGFjZUF0dHIsCisJCQkJICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKQoreworCXVuc2lnbmVkIGludCB0ZW1wOworCisJaWYgKHNpemUgPT0gMCkgeworCQlHVF9SRVNFVF9SRUdfQklUUyAoTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfRU5BQkxFX1JFRywKKwkJCQkgICAxIDw8IG1lbVNwYWNlKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogVGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIHNpemUuICAqLworCWlmIChiYXNlQWRkcmVzcyAlIHNpemUgIT0gMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChzaXplIDwgMHgxMDAwMCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogQWxpZ24gc2l6ZSBhbmQgYmFzZSB0byA2NEsgKi8KKwliYXNlQWRkcmVzcyAmPSAweGZmZmYwMDAwOworCXNpemUgJj0gMHhmZmZmMDAwMDsKKwl0ZW1wID0gc2l6ZSA+PiAxNjsKKworCS8qIENoZWNraW5nIHRoYXQgdGhlIHNpemUgaXMgYSBzZXF1ZW5jZSBvZiAnMScgZm9sbG93ZWQgYnkgYQorCSAgIHNlcXVlbmNlIG9mICcwJyBzdGFydGluZyBmcm9tIExTQiB0byBNU0IuICovCisJd2hpbGUgKCh0ZW1wID4gMCkgJiYgKHRlbXAgJiAweDEpKSB7CisJCXRlbXAgPSB0ZW1wID4+IDE7CisJfQorCisJaWYgKHRlbXAgIT0gMCkgeworCQlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX1JFRzAgKyBtZW1TcGFjZSAqIDgsCisJCQkgICAgICAoYmFzZUFkZHJlc3MgfCBtZW1TcGFjZVRhcmdldCB8IG1lbVNwYWNlQXR0cikpOworCQlHVF9SRUdfV1JJVEUgKChNVjY0NDYwX0NVTklUX1NJWkUwICsgbWVtU3BhY2UgKiA4KSwKKwkJCSAgICAgIChzaXplIC0gMSkgJiAweGZmZmYwMDAwKTsKKwkJR1RfUkVTRVRfUkVHX0JJVFMgKE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX0VOQUJMRV9SRUcsCisJCQkJICAgMSA8PCBtZW1TcGFjZSk7CisJfSBlbHNlIHsKKwkJLyogQW4gaW52YWxpZCBzaXplIHdhcyBzcGVjaWZpZWQgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tcHNjLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvbXBzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzBjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvbXBzYy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb2huIENsZW1lbnMgPGNsZW1lbnNAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNoYW5nZXMgZm9yIE1hcnZlbGwgREI2NDQ2MCBldmFsIGJvYXJkIDIwMDMgYnkgSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKiBtcHNjLmggLSBoZWFkZXIgZmlsZSBmb3IgTVBTQyBpbiB1YXJ0IG1vZGUgKGNvbnNvbGUgZHJpdmVyKQorICovCisKKyNpZm5kZWYgX19NUFNDX0hfXworI2RlZmluZSBfX01QU0NfSF9fCisKKy8qIGluY2x1ZGUgYWN0dWFsIEdhbGlsZW8gZGVmaW5lcyAqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorCisvKiBkcml2ZXIgcmVsYXRlZCBkZWZpbmVzICovCisKK2ludCBtcHNjX2luaXQoaW50IGJhdWQpOwordm9pZCBtcHNjX3NkbWFfaW5pdCh2b2lkKTsKK3ZvaWQgbXBzY19pbml0Mih2b2lkKTsKK2ludCBnYWxicmdfc2V0X2JhdWRyYXRlKGludCBjaGFubmVsLCBpbnQgcmF0ZSk7CisKK2ludCBtcHNjX3B1dGNoYXJfZWFybHkoY2hhciBjaCk7CitjaGFyIG1wc2NfZ2V0Y2hhcl9kZWJ1Zyh2b2lkKTsKK2ludCBtcHNjX3Rlc3RfY2hhcl9kZWJ1Zyh2b2lkKTsKKworaW50IG1wc2NfdGVzdF9jaGFyX3NkbWEodm9pZCk7CisKK2V4dGVybiBpbnQgKCptcHNjX3B1dGNoYXIpKGNoYXIgY2gpOworZXh0ZXJuIGNoYXIgKCptcHNjX2dldGNoYXIpKHZvaWQpOworZXh0ZXJuIGludCAoKm1wc2NfdGVzdF9jaGFyKSh2b2lkKTsKKworI2RlZmluZSBDSEFOTkVMIENPTkZJR19NUFNDX1BPUlQKKworI2RlZmluZSBUWF9ERVNDICAgICA1CisjZGVmaW5lIFJYX0RFU0MgICAgIDIwCisKKyNkZWZpbmUgREVTQ19GSVJTVCAgMHgwMDAxMDAwMAorI2RlZmluZSBERVNDX0xBU1QgICAweDAwMDIwMDAwCisjZGVmaW5lIERFU0NfT1dORVJfQklUICAweDgwMDAwMDAwCisKKyNkZWZpbmUgVFhfREVNQU5EICAgMHgwMDgwMDAwMAorI2RlZmluZSBUWF9TVE9QICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFJYX0VOQUJMRSAgIDB4MDAwMDAwODAKKworI2RlZmluZSBTRE1BX1JYX0FCT1JUIAkJICAoMSA8PCAxNSkKKyNkZWZpbmUgU0RNQV9UWF9BQk9SVCAJCSAgKDEgPDwgMzEpCisjZGVmaW5lIE1QU0NfVFhfQUJPUlQgCQkgICgxIDw8IDcpCisjZGVmaW5lIE1QU0NfUlhfQUJPUlQgICAgICAgICAgICAgKDEgPDwgMjMpCisjZGVmaW5lIE1QU0NfRU5URVJfSFVOVCAgICAgICAgICAgKDEgPDwgMzEpCisKKy8qIE1QU0MgZGVmaW5lcyAqLworCisjZGVmaW5lIEdBTE1QU0NfQ09OTkVDVCAgICAgICAgICAgIDB4MQorI2RlZmluZSBHQUxNUFNDX0RJU0NPTk5FQ1QgICAgICAgICAweDAKKworI2RlZmluZSBHQUxNUFNDX1VBUlQgICAgICAgICAgICAgICAweDEKKworI2RlZmluZSBHQUxNUFNDX1NUT1BfQklUU18xICAgICAgICAweDAKKyNkZWZpbmUgR0FMTVBTQ19TVE9QX0JJVFNfMiAgICAgICAgMHgxCisjZGVmaW5lIEdBTE1QU0NfQ0hBUl9MRU5HVEhfOCAgICAgIDB4MworI2RlZmluZSBHQUxNUFNDX0NIQVJfTEVOR1RIXzcgICAgICAweDIKKworI2RlZmluZSBHQUxNUFNDX1BBUklUWV9PREQgICAgICAgICAweDAKKyNkZWZpbmUgR0FMTVBTQ19QQVJJVFlfRVZFTiAgICAgICAgMHgyCisjZGVmaW5lIEdBTE1QU0NfUEFSSVRZX01BUksgICAgICAgIDB4MworI2RlZmluZSBHQUxNUFNDX1BBUklUWV9TUEFDRSAgICAgICAweDEKKyNkZWZpbmUgR0FMTVBTQ19QQVJJVFlfTk9ORSAgICAgICAgLTEKKworI2RlZmluZSBHQUxNUFNDX1NFUklBTF9NVUxUSVBMRVggICBTRVJJQUxfUE9SVF9NVUxUSVBMRVggICAgICAgICAgIC8qIDB4ZjAxMCAqLworI2RlZmluZSBHQUxNUFNDX1JPVVRJTkdfUkVHSVNURVIgICBNQUlOX1JPVVRJTkdfUkVHSVNURVIgICAgICAgICAgIC8qIDB4YjQwMCAqLworI2RlZmluZSBHQUxNUFNDX1J4Q19ST1VURSAgICAgICAgICBSRUNFSVZFX0NMT0NLX1JPVVRJTkdfUkVHSVNURVIgIC8qIDB4YjQwNCAqLworI2RlZmluZSBHQUxNUFNDX1R4Q19ST1VURSAgICAgICAgICBUUkFOU01JVF9DTE9DS19ST1VUSU5HX1JFR0lTVEVSIC8qIDB4YjQwOCAqLworI2RlZmluZSBHQUxNUFNDX01DT05GX0xPVyAgICAgICAgICBNUFNDMF9NQUlOX0NPTkZJR1VSQVRJT05fTE9XICAgIC8qIDB4ODAwMCAqLworI2RlZmluZSBHQUxNUFNDX01DT05GX0hJR0ggICAgICAgICBNUFNDMF9NQUlOX0NPTkZJR1VSQVRJT05fSElHSCAgIC8qIDB4ODAwNCAqLworI2RlZmluZSBHQUxNUFNDX1BST1RPQ09ORl9SRUcgICAgICBNUFNDMF9QUk9UT0NPTF9DT05GSUdVUkFUSU9OICAgIC8qIDB4ODAwOCAqLworCisjZGVmaW5lIEdBTE1QU0NfUkVHX0dBUCAgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIEdBTE1QU0NfTUNPTkZfQ0hSRUdfQkFTRSAgIENIQU5ORUwwX1JFR0lTVEVSMSAgLyogMHg4MDBjICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR18xICAgICAgIENIQU5ORUwwX1JFR0lTVEVSMSAgLyogMHg4MDBjICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR18yICAgICAgIENIQU5ORUwwX1JFR0lTVEVSMiAgLyogMHg4MDEwICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR18zICAgICAgIENIQU5ORUwwX1JFR0lTVEVSMyAgLyogMHg4MDE0ICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR180ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSNCAgLyogMHg4MDE4ICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR181ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSNSAgLyogMHg4MDFjICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR182ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSNiAgLyogMHg4MDIwICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR183ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSNyAgLyogMHg4MDI0ICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR184ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSOCAgLyogMHg4MDI4ICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR185ICAgICAgIENIQU5ORUwwX1JFR0lTVEVSOSAgLyogMHg4MDJjICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR18xMCAgICAgIENIQU5ORUwwX1JFR0lTVEVSMTAgLyogMHg4MDMwICovCisjZGVmaW5lIEdBTE1QU0NfQ0hBTk5FTFJFR18xMSAgICAgIENIQU5ORUwwX1JFR0lTVEVSMTEgLyogMHg4MDM0ICovCisKKyNkZWZpbmUgR0FMU0RNQV9DT01NQU5EX0ZJUlNUICAgICAoMSA8PCAxNikKKyNkZWZpbmUgR0FMU0RNQV9DT01NQU5EX0xBU1QgICAgICAoMSA8PCAxNykKKyNkZWZpbmUgR0FMU0RNQV9DT01NQU5EX0VOQUJMRUlOVCAoMSA8PCAyMykKKyNkZWZpbmUgR0FMU0RNQV9DT01NQU5EX0FVVE8gICAgICAoMSA8PCAzMCkKKyNkZWZpbmUgR0FMU0RNQV9DT01NQU5EX09XTkVSICAgICAoMSA8PCAzMSkKKworI2RlZmluZSBHQUxTRE1BX1JYICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdBTFNETUFfVFggICAgICAgICAgICAgICAgIDEKKworLyogQ0hBTk5FTDIgc2hvdWxkIGJlIENIQU5ORUwxLCBhY2NvcmRpbmcgdG8gZG9jdW1lbnRhdGlvbiwKKyAqIGJ1dCB0byB3b3JrIHdpdGggdGhlIGN1cnJlbnQgR1RSRUdTIGZpbGUuLi4KKyAqLworI2RlZmluZSBHQUxTRE1BXzBfQ09ORl9SRUcgICAgICAgICBDSEFOTkVMMF9DT05GSUdVUkFUSU9OX1JFR0lTVEVSICAgLyogMHg0MDAwICovCisjZGVmaW5lIEdBTFNETUFfMV9DT05GX1JFRyAgICAgICAgIENIQU5ORUwyX0NPTkZJR1VSQVRJT05fUkVHSVNURVIgICAvKiAweDYwMDAgKi8KKyNkZWZpbmUgR0FMU0RNQV8wX0NPTV9SRUcgICAgICAgICAgQ0hBTk5FTDBfQ09NTUFORF9SRUdJU1RFUiAgICAgICAgIC8qIDB4NDAwOCAqLworI2RlZmluZSBHQUxTRE1BXzFfQ09NX1JFRyAgICAgICAgICBDSEFOTkVMMl9DT01NQU5EX1JFR0lTVEVSICAgICAgICAgLyogMHg2MDA4ICovCisjZGVmaW5lIEdBTFNETUFfMF9DVVJfUlhfUFRSICAgICAgIENIQU5ORUwwX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSICAvKiAweDQ4MTAgKi8KKyNkZWZpbmUgR0FMU0RNQV8wX0NVUl9UWF9QVFIgICAgICAgQ0hBTk5FTDBfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIgIC8qIDB4NGMxMCAqLworI2RlZmluZSBHQUxTRE1BXzBfRklSX1RYX1BUUiAgICAgICBDSEFOTkVMMF9GSVJTVF9UWF9ERVNDUklQVE9SX1BPSU5URVIgICAgLyogMHg0YzE0ICovCisjZGVmaW5lIEdBTFNETUFfMV9DVVJfUlhfUFRSICAgICAgIENIQU5ORUwyX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSICAvKiAweDY4MTAgKi8KKyNkZWZpbmUgR0FMU0RNQV8xX0NVUl9UWF9QVFIgICAgICAgQ0hBTk5FTDJfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIgIC8qIDB4NmMxMCAqLworI2RlZmluZSBHQUxTRE1BXzFfRklSX1RYX1BUUiAgICAgICBDSEFOTkVMMl9GSVJTVF9UWF9ERVNDUklQVE9SX1BPSU5URVIgICAgLyogMHg2YzE0ICovCisjZGVmaW5lIEdBTFNETUFfUkVHX0RJRkYgICAgICAgICAgIDB4MjAwMAorCisvKiBXUk9ORyBpbiBndDY0MjYwUi5oICovCisjZGVmaW5lIEdBTFNETUFfSU5UX0NBVVNFICAgICAgICAgIDB4YjgwMCAgIC8qIFNETUFfQ0FVU0UgKi8KKyNkZWZpbmUgR0FMU0RNQV9JTlRfTUFTSyAgICAgICAgICAgMHhiODgwICAgLyogU0RNQV9NQVNLICAqLworI2RlZmluZSBHQUxNUFNDXzBfSU5UX0NBVVNFICAgICAgICAweGI4MDQKKyNkZWZpbmUgR0FMTVBTQ18wX0lOVF9NQVNLICAgICAgICAgMHhiODg0CisKKyNkZWZpbmUgR0FMU0RNQV9NT0RFX1VBUlQgICAgICAgICAgMAorI2RlZmluZSBHQUxTRE1BX01PREVfQklTWU5DICAgICAgICAxCisjZGVmaW5lIEdBTFNETUFfTU9ERV9IRExDICAgICAgICAgIDIKKyNkZWZpbmUgR0FMU0RNQV9NT0RFX1RSQU5TUEFSRU5UICAgMworCisjZGVmaW5lIEdBTEJSR18wX0NPTkZSRUcgICAgICAgICAgIEJSRzBfQ09ORklHVVJBVElPTl9SRUdJU1RFUiAgLyogIDB4YjIwMCAgKi8KKyNkZWZpbmUgR0FMQlJHX1JFR19HQVAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEdBTEJSR18wX0JUUkVHICAgICAgICAgICAgIEJSRzBfQkFVREVfVFVOSU5HX1JFR0lTVEVSICAgLyogIDB4YjIwNCAgKi8KKworI2VuZGlmIC8qIF9fTVBTQ19IX18gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tdl9ldGguYyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tdl9ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhmZGEzCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL212X2V0aC5jCkBAIC0wLDAgKzEsMzE4MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqIGJhc2VkIG9uIC0gRHJpdmVyIGZvciBNVjY0NDYwWCBldGhlcm5ldCBwb3J0cworICogQ29weXJpZ2h0IChDKSAyMDAyIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIG12X2V0aC5jIC0gaGVhZGVyIGZpbGUgZm9yIHRoZSBwb2xsZWQgbW9kZSBHVCBldGhlcm5ldCBkcml2ZXIKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaW5jbHVkZSAibXZfZXRoLmgiCisKKy8qIGVuYWJsZSBEZWJ1ZyBvdXRwdXRzICovCisKKyN1bmRlZiBERUJVR19NVl9FVEgKKworI2lmZGVmIERFQlVHX01WX0VUSAorI2RlZmluZSBERUJVRworI2RlZmluZSBEUCh4KSB4CisjZWxzZQorI2RlZmluZSBEUCh4KQorI2VuZGlmCisKKyN1bmRlZiBNVjY0NDYwX0NIRUNLU1VNX09GRkxPQUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFRoZSBmaXJzdCBwYXJ0IGlzIHRoZSBoaWdoIGxldmVsIGRyaXZlciBvZiB0aGUgZ2lnRSBldGhlcm5ldCBwb3J0cy4gICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluaXRpb24gZm9yIGNvbmZpZ3VyaW5nIGRyaXZlciAqLworLyogI2RlZmluZSBVUERBVEVfU1RBVFNfQllfU09GVFdBUkUgKi8KKyN1bmRlZiBNVjY0NDYwX1JYX1FVRVVFX0ZJTExfT05fVEFTSworCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSBNQUdJQ19FVEhfUlVOTklORwkJODAzMTk3MQorI2RlZmluZSBNVjY0NDYwX0lOVEVSTkFMX1NSQU1fU0laRSAgICAgICAgICAgICAgICAgICAgICBfMjU2SworI2RlZmluZSBFWFRSQV9CWVRFUyAzMgorI2RlZmluZSBXUkFQICAgICAgIEVUSF9ITEVOICsgMiArIDQgKyAxNgorI2RlZmluZSBCVUZGRVJfTVRVIGRldi0+bXR1ICsgV1JBUAorI2RlZmluZSBJTlRfQ0FVU0VfVU5NQVNLX0FMTAkJMHgwMDA3ZmZmZgorI2RlZmluZSBJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQJMHgwMDExZmZmZgorI2lmZGVmIE1WNjQ0NjBfUlhfRklMTF9PTl9UQVNLCisjZGVmaW5lIElOVF9DQVVTRV9NQVNLX0FMTAkJMHgwMDAwMDAwMAorI2RlZmluZSBJTlRfQ0FVU0VfQ0hFQ0tfQklUUwkJSU5UX0NBVVNFX1VOTUFTS19BTEwKKyNkZWZpbmUgSU5UX0NBVVNFX0NIRUNLX0JJVFNfRVhUCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVAorI2VuZGlmCisKKy8qIFJlYWQvV3JpdGUgdG8vZnJvbSBNVjY0NDYwIGludGVybmFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBNVl9SRUdfUkVBRChvZmZzZXQpIG15X2xlMzJfdG9fY3B1KCogKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoSU5URVJOQUxfUkVHX0JBU0VfQUREUiArIG9mZnNldCkpCisjZGVmaW5lIE1WX1JFR19XUklURShvZmZzZXQsZGF0YSkgKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKElOVEVSTkFMX1JFR19CQVNFX0FERFIgKyBvZmZzZXQpID0gbXlfY3B1X3RvX2xlMzIgKGRhdGEpCisjZGVmaW5lIE1WX1NFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykgKCgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKSgoSU5URVJOQUxfUkVHX0JBU0VfQUREUikgKyAocmVnT2Zmc2V0KSkpKSB8PSAoKHVuc2lnbmVkIGludClteV9jcHVfdG9fbGUzMihiaXRzKSkpCisjZGVmaW5lIE1WX1JFU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKSAoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKChJTlRFUk5BTF9SRUdfQkFTRV9BRERSKSArIChyZWdPZmZzZXQpKSkpICY9IH4oKHVuc2lnbmVkIGludClteV9jcHVfdG9fbGUzMihiaXRzKSkpCisKKy8qIFN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgbXY2NDQ2MF9ldGhfcmVhbF9vcGVuIChzdHJ1Y3QgZXRoX2RldmljZSAqZXRoKTsKK3N0YXRpYyBpbnQgbXY2NDQ2MF9ldGhfcmVhbF9zdG9wIChzdHJ1Y3QgZXRoX2RldmljZSAqZXRoKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbXY2NDQ2MF9ldGhfZ2V0X3N0YXRzIChzdHJ1Y3QgZXRoX2RldmljZQorCQkJCQkJICAgICAgICpkZXYpOworc3RhdGljIHZvaWQgZXRoX3BvcnRfaW5pdF9tYWNfdGFibGVzIChFVEhfUE9SVCBldGhfcG9ydF9udW0pOworc3RhdGljIHZvaWQgbXY2NDQ2MF9ldGhfdXBkYXRlX3N0YXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworYm9vbCBkYjY0NDYwX2V0aF9zdGFydCAoc3RydWN0IGV0aF9kZXZpY2UgKmV0aCk7Cit1bnNpZ25lZCBpbnQgZXRoX3JlYWRfbWliX2NvdW50ZXIgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbWliX29mZnNldCk7CitpbnQgbXY2NDQ2MF9ldGhfcmVjZWl2ZSAoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7CisKK2ludCBtdjY0NDYwX2V0aF94bWl0IChzdHJ1Y3QgZXRoX2RldmljZSAqLCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpOworCisjaWZuZGVmICBVUERBVEVfU1RBVFNfQllfU09GVFdBUkUKK3N0YXRpYyB2b2lkIG12NjQ0NjBfZXRoX3ByaW50X3N0YXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworI2VuZGlmCisvKiBQcm9jZXNzZXMgYSByZWNlaXZlZCBwYWNrZXQgKi8KK2V4dGVybiB2b2lkIE5ldFJlY2VpdmUgKHZvbGF0aWxlIHVjaGFyICosIGludCk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgSU5URVJOQUxfUkVHX0JBU0VfQUREUjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqSGVscGVyIGZ1bmN0aW9ucyAtIHVzZWQgaW5zaWRlIHRoZSBkcml2ZXIgb25seSAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBERUJVR19NVl9FVEgKK3ZvaWQgcHJpbnRfZ2xvYmFscyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlwcmludGYgKCJFdGhlcm5ldCBQUklOVF9HbG9iYWxzLURlYnVnIGZ1bmN0aW9uXG4iKTsKKwlwcmludGYgKCJCYXNlIEFkZHJlc3MgZm9yIEVUSF9QT1JUX0lORk86CSUwOHhcbiIsCisJCSh1bnNpZ25lZCBpbnQpIGRldi0+cHJpdik7CisJcHJpbnRmICgiQmFzZSBBZGRyZXNzIGZvciBtdjY0NDYwX2V0aF9wcml2OgklMDh4XG4iLAorCQkodW5zaWduZWQgaW50KSAmKCgoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXYpLT4KKwkJCQkgcG9ydF9wcml2YXRlKSk7CisKKwlwcmludGYgKCJHVCBJbnRlcm5hbCBCYXNlIEFkZHJlc3M6CSUwOHhcbiIsCisJCUlOVEVSTkFMX1JFR19CQVNFX0FERFIpOworCXByaW50ZiAoIkJhc2UgQWRkcmVzcyBmb3IgVFgtREVTQ3M6CSUwOHgJTnVtYmVyIG9mIGFsbG9jYXRlZCBCdWZmZXJzICVkXG4iLCAodW5zaWduZWQgaW50KSAoKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2KS0+cF90eF9kZXNjX2FyZWFfYmFzZVswXSwgTVY2NDQ2MF9UWF9RVUVVRV9TSVpFKTsKKwlwcmludGYgKCJCYXNlIEFkZHJlc3MgZm9yIFJYLURFU0NzOgklMDh4CU51bWJlciBvZiBhbGxvY2F0ZWQgQnVmZmVycyAlZFxuIiwgKHVuc2lnbmVkIGludCkgKChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdiktPnBfcnhfZGVzY19hcmVhX2Jhc2VbMF0sIE1WNjQ0NjBfUlhfUVVFVUVfU0laRSk7CisJcHJpbnRmICgiQmFzZSBBZGRyZXNzIGZvciBSWC1CdWZmZXI6CSUwOHgJYWxsb2NhdGVkIEJ5dGVzICVkXG4iLAorCQkodW5zaWduZWQgaW50KSAoKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2KS0+CisJCXBfcnhfYnVmZmVyX2Jhc2VbMF0sCisJCShNVjY0NDYwX1JYX1FVRVVFX1NJWkUgKiBNVjY0NDYwX1JYX0JVRkZFUl9TSVpFKSArIDMyKTsKKwlwcmludGYgKCJCYXNlIEFkZHJlc3MgZm9yIFRYLUJ1ZmZlcjoJJTA4eAlhbGxvY2F0ZWQgQnl0ZXMgJWRcbiIsCisJCSh1bnNpZ25lZCBpbnQpICgoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXYpLT4KKwkJcF90eF9idWZmZXJfYmFzZVswXSwKKwkJKE1WNjQ0NjBfVFhfUVVFVUVfU0laRSAqIE1WNjQ0NjBfVFhfQlVGRkVSX1NJWkUpICsgMzIpOworfQorI2VuZGlmCisKKyNkZWZpbmUgbXlfY3B1X3RvX2xlMzIoeCkgbXlfbGUzMl90b19jcHUoKHgpKQorCit1bnNpZ25lZCBsb25nIG15X2xlMzJfdG9fY3B1ICh1bnNpZ25lZCBsb25nIHgpCit7CisJcmV0dXJuICgoKHggJiAweDAwMDAwMGZmVSkgPDwgMjQpIHwKKwkJKCh4ICYgMHgwMDAwZmYwMFUpIDw8IDgpIHwKKwkJKCh4ICYgMHgwMGZmMDAwMFUpID4+IDgpIHwgKCh4ICYgMHhmZjAwMDAwMFUpID4+IDI0KSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX3ByaW50X3BoeV9zdGF0dXMKKyAqCisgKiBQcmludHMgZ2lnYWJpdCBldGhlbnJldCBwaHkgc3RhdHVzCisgKgorICogSW5wdXQgOiBwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6IE4vQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG12NjQ0NjBfZXRoX3ByaW50X3BoeV9zdGF0dXMgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgcG9ydF9zdGF0dXMsIHBoeV9yZWdfZGF0YTsKKworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisJLyogQ2hlY2sgTGluayBzdGF0dXMgb24gcGh5ICovCisJZXRoX3BvcnRfcmVhZF9zbWlfcmVnIChwb3J0X251bSwgMSwgJnBoeV9yZWdfZGF0YSk7CisJaWYgKCEocGh5X3JlZ19kYXRhICYgMHgyMCkpIHsKKwkJcHJpbnRmICgiRXRoZXJuZXQgcG9ydCBjaGFuZ2VkIGxpbmsgc3RhdHVzIHRvIERPV05cbiIpOworCX0gZWxzZSB7CisJCXBvcnRfc3RhdHVzID0KKwkJCU1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9QT1JUX1NUQVRVU19SRUcgKHBvcnRfbnVtKSk7CisJCXByaW50ZiAoIkV0aGVybmV0IHN0YXR1cyBwb3J0ICVkOiBMaW5rIHVwIiwgcG9ydF9udW0pOworCQlwcmludGYgKCIsICVzIiwKKwkJCShwb3J0X3N0YXR1cyAmIEJJVDIpID8gIkZ1bGwgRHVwbGV4IiA6ICJIYWxmIER1cGxleCIpOworCQlpZiAocG9ydF9zdGF0dXMgJiBCSVQ0KQorCQkJcHJpbnRmICgiLCBTcGVlZCAxIEdicHMiKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiLCAlcyIsCisJCQkJKHBvcnRfc3RhdHVzICYgQklUNSkgPyAiU3BlZWQgMTAwIE1icHMiIDoKKwkJCQkiU3BlZWQgMTAgTWJwcyIpOworCQlwcmludGYgKCJcbiIpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHUtYm9vdCBlbnRyeSBmdW5jdGlvbnMgZm9yIG12NjQ0NjBfZXRoCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZGI2NDQ2MF9ldGhfcHJvYmUgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICgoaW50KSBkYjY0NDYwX2V0aF9zdGFydCAoZGV2KSk7Cit9CisKK2ludCBkYjY0NDYwX2V0aF9wb2xsIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCXJldHVybiBtdjY0NDYwX2V0aF9yZWNlaXZlIChkZXYpOworfQorCitpbnQgZGI2NDQ2MF9ldGhfdHJhbnNtaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHZvbGF0aWxlIHZvaWQgKnBhY2tldCwKKwkJCSAgaW50IGxlbmd0aCkKK3sKKwltdjY0NDYwX2V0aF94bWl0IChkZXYsIHBhY2tldCwgbGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYjY0NDYwX2V0aF9kaXNhYmxlIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCW12NjQ0NjBfZXRoX3N0b3AgKGRldik7Cit9CisKKwordm9pZCBtdjY0NDZ4X2V0aF9pbml0aWFsaXplIChiZF90ICogYmlzKQoreworCXN0cnVjdCBldGhfZGV2aWNlICpkZXY7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCWludCBkZXZudW0sIHgsIHRlbXA7CisJY2hhciAqcywgKmUsIGJ1Zls2NF07CisKKwlmb3IgKGRldm51bSA9IDA7IGRldm51bSA8IE1WX0VUSF9ERVZTOyBkZXZudW0rKykgeworCQlkZXYgPSBjYWxsb2MgKHNpemVvZiAoKmRldiksIDEpOworCQlpZiAoIWRldikgeworCQkJcHJpbnRmICgiJXM6IG12X2VuZXQlZCBhbGxvY2F0aW9uIGZhaWx1cmUsICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2bnVtLCAiZXRoX2RldmljZSBzdHJ1Y3R1cmUiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIG11c3QgYmUgbGVzcyB0aGFuIE5BTUVTSVpFICgxNikgKi8KKwkJc3ByaW50ZiAoZGV2LT5uYW1lLCAibXZfZW5ldCVkIiwgZGV2bnVtKTsKKworI2lmZGVmIERFQlVHCisJCXByaW50ZiAoIkluaXRpYWxpemluZyAlc1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCS8qIEV4dHJhY3QgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGVudmlyb25tZW50ICovCisJCXN3aXRjaCAoZGV2bnVtKSB7CisJCWNhc2UgMDoKKwkJCXMgPSAiZXRoYWRkciI7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlzID0gImV0aDFhZGRyIjsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoKKwkJCXMgPSAiZXRoMmFkZHIiOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlwcmludGYgKCIlczogSW52YWxpZCBkZXZpY2UgbnVtYmVyICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZGV2bnVtKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXRlbXAgPSBnZXRlbnZfciAocywgYnVmLCBzaXplb2YgKGJ1ZikpOworCQlzID0gKHRlbXAgPiAwKSA/IGJ1ZiA6IE5VTEw7CisKKyNpZmRlZiBERUJVRworCQlwcmludGYgKCJTZXR0aW5nIE1BQyAlZCB0byAlc1xuIiwgZGV2bnVtLCBzKTsKKyNlbmRpZgorCQlmb3IgKHggPSAwOyB4IDwgNjsgKyt4KSB7CisJCQlkZXYtPmVuZXRhZGRyW3hdID0gcyA/IHNpbXBsZV9zdHJ0b3VsIChzLCAmZSwgMTYpIDogMDsKKwkJCWlmIChzKQorCQkJCXMgPSAoKmUpID8gZSArIDEgOiBlOworCQl9CisJCS8qIHJvbmVuIC0gc2V0IHRoZSBNQUMgYWRkciBpbiB0aGUgSFcgKi8KKwkJZXRoX3BvcnRfdWNfYWRkcl9zZXQgKGRldm51bSwgZGV2LT5lbmV0YWRkciwgMCk7CisKKwkJZGV2LT5pbml0ID0gKHZvaWQgKikgZGI2NDQ2MF9ldGhfcHJvYmU7CisJCWRldi0+aGFsdCA9ICh2b2lkICopIGV0aGVybmV0X3BoeV9yZXNldDsKKwkJZGV2LT5zZW5kID0gKHZvaWQgKikgZGI2NDQ2MF9ldGhfdHJhbnNtaXQ7CisJCWRldi0+cmVjdiA9ICh2b2lkICopIGRiNjQ0NjBfZXRoX3BvbGw7CisKKwkJZGV2LT5wcml2ID0gKHZvaWQgKikgZXRoZXJuZXRfcHJpdmF0ZSA9CisJCQljYWxsb2MgKHNpemVvZiAoKmV0aGVybmV0X3ByaXZhdGUpLCAxKTsKKwkJaWYgKCFldGhlcm5ldF9wcml2YXRlKSB7CisJCQlwcmludGYgKCIlczogJXMgYWxsb2NhdGlvbiBmYWlsdXJlLCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwKKwkJCQkiUHJpdmF0ZSBEZXZpY2UgU3RydWN0dXJlIik7CisJCQlmcmVlIChkZXYpOworCQkJcmV0dXJuOworCQl9CisJCS8qIHN0YXJ0IHdpdGggYW4gemVyb2VkIEVUSF9QT1JUX0lORk8gKi8KKwkJbWVtc2V0IChldGhlcm5ldF9wcml2YXRlLCAwLCBzaXplb2YgKEVUSF9QT1JUX0lORk8pKTsKKwkJbWVtY3B5IChldGhlcm5ldF9wcml2YXRlLT5wb3J0X21hY19hZGRyLCBkZXYtPmVuZXRhZGRyLCA2KTsKKworCQkvKiBzZXQgcG9pbnRlciB0byBtZW1vcnkgZm9yIHN0YXRzIGRhdGEgc3RydWN0dXJlIGV0Yy4uLiAqLworCQlldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGUgPSAodm9pZCAqKSBwb3J0X3ByaXZhdGUgPQorCQkJY2FsbG9jIChzaXplb2YgKCpldGhlcm5ldF9wcml2YXRlKSwgMSk7CisJCWlmICghcG9ydF9wcml2YXRlKSB7CisJCQlwcmludGYgKCIlczogJXMgYWxsb2NhdGlvbiBmYWlsdXJlLCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwKKwkJCQkiUG9ydCBQcml2YXRlIERldmljZSBTdHJ1Y3R1cmUiKTsKKworCQkJZnJlZSAoZXRoZXJuZXRfcHJpdmF0ZSk7CisJCQlmcmVlIChkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJcG9ydF9wcml2YXRlLT5zdGF0cyA9CisJCQljYWxsb2MgKHNpemVvZiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpLCAxKTsKKwkJaWYgKCFwb3J0X3ByaXZhdGUtPnN0YXRzKSB7CisJCQlwcmludGYgKCIlczogJXMgYWxsb2NhdGlvbiBmYWlsdXJlLCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSwKKwkJCQkiTmV0IHN0YXQgU3RydWN0dXJlIik7CisKKwkJCWZyZWUgKHBvcnRfcHJpdmF0ZSk7CisJCQlmcmVlIChldGhlcm5ldF9wcml2YXRlKTsKKwkJCWZyZWUgKGRldik7CisJCQlyZXR1cm47CisJCX0KKwkJbWVtc2V0IChldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGUsIDAsCisJCQlzaXplb2YgKHN0cnVjdCBtdjY0NDYwX2V0aF9wcml2KSk7CisJCXN3aXRjaCAoZGV2bnVtKSB7CisJCWNhc2UgMDoKKwkJCWV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtID0gRVRIXzA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0gPSBFVEhfMTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSA9IEVUSF8yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYgKCJJbnZhbGlkIGRldmljZSBudW1iZXIgJWRcbiIsIGRldm51bSk7CisJCQlicmVhazsKKwkJfTsKKworCQlwb3J0X3ByaXZhdGUtPnBvcnRfbnVtID0gZGV2bnVtOworCQkvKgorCQkgKiBSZWFkIE1JQiBjb3VudGVyIG9uIHRoZSBHVCBpbiBvcmRlciB0byByZXNldCB0aGVtLAorCQkgKiB0aGVuIHplcm8gYWxsIHRoZSBzdGF0cyBmaWVsZHMgaW4gbWVtb3J5CisJCSAqLworCQltdjY0NDYwX2V0aF91cGRhdGVfc3RhdCAoZGV2KTsKKwkJbWVtc2V0IChwb3J0X3ByaXZhdGUtPnN0YXRzLCAwLAorCQkJc2l6ZW9mIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCQkvKiBFeHRyYWN0IHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLworCQlzd2l0Y2ggKGRldm51bSkgeworCQljYXNlIDA6CisJCQlzID0gImV0aGFkZHIiOworCQkJYnJlYWs7CisKKwkJY2FzZSAxOgorCQkJcyA9ICJldGgxYWRkciI7CisJCQlicmVhazsKKworCQljYXNlIDI6CisJCQlzID0gImV0aDJhZGRyIjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CS8qIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJcHJpbnRmICgiJXM6IEludmFsaWQgZGV2aWNlIG51bWJlciAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGRldm51bSk7CisJCQlyZXR1cm47CisJCX0KKworCQl0ZW1wID0gZ2V0ZW52X3IgKHMsIGJ1Ziwgc2l6ZW9mIChidWYpKTsKKwkJcyA9ICh0ZW1wID4gMCkgPyBidWYgOiBOVUxMOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRmICgiU2V0dGluZyBNQUMgJWQgdG8gJXNcbiIsIGRldm51bSwgcyk7CisjZW5kaWYKKwkJZm9yICh4ID0gMDsgeCA8IDY7ICsreCkgeworCQkJZGV2LT5lbmV0YWRkclt4XSA9IHMgPyBzaW1wbGVfc3RydG91bCAocywgJmUsIDE2KSA6IDA7CisJCQlpZiAocykKKwkJCQlzID0gKCplKSA/IGUgKyAxIDogZTsKKwkJfQorCisJCURQIChwcmludGYgKCJBbGxvY2F0aW5nIGRlc2NyaXB0b3IgYW5kIGJ1ZmZlciByaW5nc1xuIikpOworCisJCWV0aGVybmV0X3ByaXZhdGUtPnBfcnhfZGVzY19hcmVhX2Jhc2VbMF0gPQorCQkJKEVUSF9SWF9ERVNDICopIG1lbWFsaWduICgxNiwKKwkJCQkJCSAgUlhfREVTQ19BTElHTkVEX1NJWkUgKgorCQkJCQkJICBNVjY0NDYwX1JYX1FVRVVFX1NJWkUgKyAxKTsKKwkJZXRoZXJuZXRfcHJpdmF0ZS0+cF90eF9kZXNjX2FyZWFfYmFzZVswXSA9CisJCQkoRVRIX1RYX0RFU0MgKikgbWVtYWxpZ24gKDE2LAorCQkJCQkJICBUWF9ERVNDX0FMSUdORURfU0laRSAqCisJCQkJCQkgIE1WNjQ0NjBfVFhfUVVFVUVfU0laRSArIDEpOworCisJCWV0aGVybmV0X3ByaXZhdGUtPnBfcnhfYnVmZmVyX2Jhc2VbMF0gPQorCQkJKGNoYXIgKikgbWVtYWxpZ24gKDE2LAorCQkJCQkgICBNVjY0NDYwX1JYX1FVRVVFX1NJWkUgKgorCQkJCQkgICBNVjY0NDYwX1RYX0JVRkZFUl9TSVpFICsgMSk7CisJCWV0aGVybmV0X3ByaXZhdGUtPnBfdHhfYnVmZmVyX2Jhc2VbMF0gPQorCQkJKGNoYXIgKikgbWVtYWxpZ24gKDE2LAorCQkJCQkgICBNVjY0NDYwX1JYX1FVRVVFX1NJWkUgKgorCQkJCQkgICBNVjY0NDYwX1RYX0JVRkZFUl9TSVpFICsgMSk7CisKKyNpZmRlZiBERUJVR19NVl9FVEgKKwkJLyogREVCVUcgT1VUUFVUIHByaW50cyBhZHJlc3NlcyBvZiBnbG9iYWxzICovCisJCXByaW50X2dsb2JhbHMgKGRldik7CisjZW5kaWYKKwkJZXRoX3JlZ2lzdGVyIChkZXYpOworCisJfQorCURQIChwcmludGYgKCIlczogZXhpdFxuIiwgX19GVU5DVElPTl9fKSk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX29wZW4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIG9wZW5uaW5nIHRoZSBuZXR3b3JrIGRldmljZS4gVGhlIGZ1bmN0aW9uCisgKiBzaG91bGQgaW5pdGlhbGl6ZSBhbGwgdGhlIGhhcmR3YXJlLCBpbml0aWFsaXplIGN5Y2xpYyBSeC9UeAorICogZGVzY3JpcHRvcnMgY2hhaW4gYW5kIGJ1ZmZlcnMgYW5kIGFsbG9jYXRlIGFuIElSUSB0byB0aGUgbmV0d29yaworICogZGV2aWNlLgorICoKKyAqIElucHV0IDogYSBwb2ludGVyIHRvIHRoZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIC8gLyByb25lbiAtIGNoYW5nZWQgdGhlIG91dHB1dCB0byBtYXRjaCAgbmV0L2V0aC5jIG5lZWRzCisgKiBPdXRwdXQgOiBub256ZXJvIG9mIHN1Y2Nlc3MgLCB6ZXJvIGlmIGZhaWxzLgorICogdW5kZXIgY29uc3RydWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG12NjQ0NjBfZXRoX29wZW4gKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChtdjY0NDYwX2V0aF9yZWFsX29wZW4gKGRldikpOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG12NjQ0NjBfZXRoX29wZW4gKi8KK3N0YXRpYyBpbnQgbXY2NDQ2MF9ldGhfcmVhbF9vcGVuIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCisJdW5zaWduZWQgaW50IHF1ZXVlOworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJdTMyIHBvcnRfc3RhdHVzLCBwaHlfcmVnX2RhdGE7CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCS8qIHJvbmVuIC0gd2hlbiB3ZSB1cGRhdGUgdGhlIE1BQyBlbnYgcGFyYW1zIHdlIG9ubHkgdXBkYXRlIGRldi0+ZW5ldGFkZHIKKwkgICBzZWUgLi9uZXQvZXRoLmMgZXRoX3NldF9lbmV0YWRkcigpICovCisJbWVtY3B5IChldGhlcm5ldF9wcml2YXRlLT5wb3J0X21hY19hZGRyLCBkZXYtPmVuZXRhZGRyLCA2KTsKKworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisJLyogU3RvcCBSWCBRdWV1ZXMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKHBvcnRfbnVtKSwKKwkJICAgICAgMHgwMDAwZmYwMCk7CisKKwkvKiBDbGVhciB0aGUgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHIChwb3J0X251bSksIDApOworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcgKHBvcnRfbnVtKSwgMCk7CisKKwkvKiBVbm1hc2sgUlggYnVmZmVyIGFuZCBUWCBlbmQgaW50ZXJydXB0ICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcgKHBvcnRfbnVtKSwKKwkJICAgICAgSU5UX0NBVVNFX1VOTUFTS19BTEwpOworCisJLyogVW5tYXNrIHBoeSBhbmQgbGluayBzdGF0dXMgY2hhbmdlcyBpbnRlcnJ1cHRzICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHIChwb3J0X251bSksCisJCSAgICAgIElOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVCk7CisKKwkvKiBTZXQgcGh5IGFkZHJlc3Mgb2YgdGhlIHBvcnQgKi8KKwlldGhlcm5ldF9wcml2YXRlLT5wb3J0X3BoeV9hZGRyID0gMHg4ICsgcG9ydF9udW07CisKKwkvKiBBY3RpdmF0ZSB0aGUgRE1BIGNoYW5uZWxzIGV0YyAqLworCWV0aF9wb3J0X2luaXQgKGV0aGVybmV0X3ByaXZhdGUpOworCisKKwkvKiAiQWxsb2NhdGUiIHNldHVwIFRYIHJpbmdzICovCisKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBNVjY0NDYwX1RYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCQlwb3J0X3ByaXZhdGUtPnR4X3Jpbmdfc2l6ZVtxdWV1ZV0gPSBNVjY0NDYwX1RYX1FVRVVFX1NJWkU7CisJCXNpemUgPSAocG9ydF9wcml2YXRlLT50eF9yaW5nX3NpemVbcXVldWVdICogVFhfREVTQ19BTElHTkVEX1NJWkUpOwkvKnNpemUgPSBubyBvZiBERVNDcyB0aW1lcyBERVNDLXNpemUgKi8KKwkJZXRoZXJuZXRfcHJpdmF0ZS0+dHhfZGVzY19hcmVhX3NpemVbcXVldWVdID0gc2l6ZTsKKworCQkvKiBmaXJzdCBjbGVhciBkZXNjIGFyZWEgY29tcGxldGVseSAqLworCQltZW1zZXQgKCh2b2lkICopIGV0aGVybmV0X3ByaXZhdGUtPnBfdHhfZGVzY19hcmVhX2Jhc2VbcXVldWVdLAorCQkJMCwgZXRoZXJuZXRfcHJpdmF0ZS0+dHhfZGVzY19hcmVhX3NpemVbcXVldWVdKTsKKworCQkvKiBpbml0aWFsaXplIHR4IGRlc2MgcmluZyB3aXRoIGxvdyBsZXZlbCBkcml2ZXIgKi8KKwkJaWYgKGV0aGVyX2luaXRfdHhfZGVzY19yaW5nCisJCSAgICAoZXRoZXJuZXRfcHJpdmF0ZSwgRVRIX1EwLAorCQkgICAgIHBvcnRfcHJpdmF0ZS0+dHhfcmluZ19zaXplW3F1ZXVlXSwKKwkJICAgICBNVjY0NDYwX1RYX0JVRkZFUl9TSVpFIC8qIEVhY2ggQnVmZmVyIGlzIDE2MDAgQnl0ZSAqLyAsCisJCSAgICAgKHVuc2lnbmVkIGludCkgZXRoZXJuZXRfcHJpdmF0ZS0+CisJCSAgICAgcF90eF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0sCisJCSAgICAgKHVuc2lnbmVkIGludCkgZXRoZXJuZXRfcHJpdmF0ZS0+CisJCSAgICAgcF90eF9idWZmZXJfYmFzZVtxdWV1ZV0pID09IGZhbHNlKQorCQkJcHJpbnRmICgiIyMjIEVycm9yIGluaXRpYWxpemluZyBUWCBSaW5nXG4iKTsKKwl9CisKKwkvKiAiQWxsb2NhdGUiIHNldHVwIFJYIHJpbmdzICovCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTVY2NDQ2MF9SWF9RVUVVRV9OVU07IHF1ZXVlKyspIHsKKwkJdW5zaWduZWQgaW50IHNpemU7CisKKwkJLyogTWVhbnRpbWUgUlggUmluZyBhcmUgZml4ZWQgLSBidXQgbXVzdCBiZSBjb25maWd1cmFibGUgYnkgdXNlciAqLworCQlwb3J0X3ByaXZhdGUtPnJ4X3Jpbmdfc2l6ZVtxdWV1ZV0gPSBNVjY0NDYwX1JYX1FVRVVFX1NJWkU7CisJCXNpemUgPSAocG9ydF9wcml2YXRlLT5yeF9yaW5nX3NpemVbcXVldWVdICoKKwkJCVJYX0RFU0NfQUxJR05FRF9TSVpFKTsKKwkJZXRoZXJuZXRfcHJpdmF0ZS0+cnhfZGVzY19hcmVhX3NpemVbcXVldWVdID0gc2l6ZTsKKworCQkvKiBmaXJzdCBjbGVhciBkZXNjIGFyZWEgY29tcGxldGVseSAqLworCQltZW1zZXQgKCh2b2lkICopIGV0aGVybmV0X3ByaXZhdGUtPnBfcnhfZGVzY19hcmVhX2Jhc2VbcXVldWVdLAorCQkJMCwgZXRoZXJuZXRfcHJpdmF0ZS0+cnhfZGVzY19hcmVhX3NpemVbcXVldWVdKTsKKwkJaWYgKChldGhlcl9pbml0X3J4X2Rlc2NfcmluZworCQkgICAgIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsCisJCSAgICAgIHBvcnRfcHJpdmF0ZS0+cnhfcmluZ19zaXplW3F1ZXVlXSwKKwkJICAgICAgTVY2NDQ2MF9SWF9CVUZGRVJfU0laRSAvKiBFYWNoIEJ1ZmZlciBpcyAxNjAwIEJ5dGUgKi8gLAorCQkgICAgICAodW5zaWduZWQgaW50KSBldGhlcm5ldF9wcml2YXRlLT4KKwkJICAgICAgcF9yeF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0sCisJCSAgICAgICh1bnNpZ25lZCBpbnQpIGV0aGVybmV0X3ByaXZhdGUtPgorCQkgICAgICBwX3J4X2J1ZmZlcl9iYXNlW3F1ZXVlXSkpID09IGZhbHNlKQorCQkJcHJpbnRmICgiIyMjIEVycm9yIGluaXRpYWxpemluZyBSWCBSaW5nXG4iKTsKKwl9CisKKwlldGhfcG9ydF9zdGFydCAoZXRoZXJuZXRfcHJpdmF0ZSk7CisKKwkvKiBTZXQgbWF4aW11bSByZWNlaXZlIGJ1ZmZlciB0byA5NzAwIGJ5dGVzICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyAocG9ydF9udW0pLAorCQkgICAgICAoMHg1IDw8IDE3KSB8CisJCSAgICAgIChNVl9SRUdfUkVBRAorCQkgICAgICAgKE1WNjQ0NjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHIChwb3J0X251bSkpCisJCSAgICAgICAmIDB4ZmZmMWZmZmYpKTsKKworCS8qCisJICogU2V0IGV0aGVybmV0IE1UVSBmb3IgbGVha3kgYnVja2V0IG1lY2hhbmlzbSB0byAwIC0gdGhpcyB3aWxsCisJICogZGlzYWJsZSB0aGUgbGVha3kgYnVja2V0IG1lY2hhbmlzbSAuCisJICovCisKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX01BWElNVU1fVFJBTlNNSVRfVU5JVCAocG9ydF9udW0pLCAwKTsKKwlwb3J0X3N0YXR1cyA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9QT1JUX1NUQVRVU19SRUcgKHBvcnRfbnVtKSk7CisKKwkvKiBDaGVjayBMaW5rIHN0YXR1cyBvbiBwaHkgKi8KKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcgKHBvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhKTsKKwlpZiAoIShwaHlfcmVnX2RhdGEgJiAweDIwKSkgeworCQkvKiBSZXNldCBQSFkgKi8KKwkJaWYgKChldGhlcm5ldF9waHlfcmVzZXQgKHBvcnRfbnVtKSkgIT0gdHJ1ZSkgeworCQkJcHJpbnRmICgiJCQgV2Fybm5pbmc6IE5vIGxpbmsgb24gcG9ydCAlZCBcbiIsCisJCQkJcG9ydF9udW0pOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlldGhfcG9ydF9yZWFkX3NtaV9yZWcgKHBvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhKTsKKwkJCWlmICghKHBoeV9yZWdfZGF0YSAmIDB4MjApKSB7CisJCQkJcHJpbnRmICgiIyMjIEVycm9yOiBQaHkgaXMgbm90IGFjdGl2ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltdjY0NDYwX2V0aF9wcmludF9waHlfc3RhdHVzIChkZXYpOworCX0KKwlwb3J0X3ByaXZhdGUtPmV0aF9ydW5uaW5nID0gTUFHSUNfRVRIX1JVTk5JTkc7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBtdjY0NDYwX2V0aF9mcmVlX3R4X3JpbmdzIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBxdWV1ZTsKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtOworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2N1cnJfZGVzYzsKKworCWV0aGVybmV0X3ByaXZhdGUgPSAoRVRIX1BPUlRfSU5GTyAqKSBkZXYtPnByaXY7CisJcG9ydF9wcml2YXRlID0KKwkJKHN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICopIGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfcHJpdmF0ZTsKKwlwb3J0X251bSA9IHBvcnRfcHJpdmF0ZS0+cG9ydF9udW07CisKKwkvKiBTdG9wIFR4IFF1ZXVlcyAqLworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcgKHBvcnRfbnVtKSwKKwkJICAgICAgMHgwMDAwZmYwMCk7CisKKwkvKiBGcmVlIFRYIHJpbmdzICovCisJRFAgKHByaW50ZiAoIkNsZWFyaW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIFRYIHF1ZXVlcy4uLiAiKSk7CisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTVY2NDQ2MF9UWF9RVUVVRV9OVU07IHF1ZXVlKyspIHsKKwkJLyogRnJlZSBvbiBUWCByaW5ncyAqLworCQlmb3IgKHBfdHhfY3Vycl9kZXNjID0KKwkJICAgICBldGhlcm5ldF9wcml2YXRlLT5wX3R4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXTsKKwkJICAgICAoKHVuc2lnbmVkIGludCkgcF90eF9jdXJyX2Rlc2MgPD0gKHVuc2lnbmVkIGludCkKKwkJICAgICAgZXRoZXJuZXRfcHJpdmF0ZS0+cF90eF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0gKworCQkgICAgICBldGhlcm5ldF9wcml2YXRlLT50eF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0pOworCQkgICAgIHBfdHhfY3Vycl9kZXNjID0KKwkJICAgICAoRVRIX1RYX0RFU0MgKikgKCh1bnNpZ25lZCBpbnQpIHBfdHhfY3Vycl9kZXNjICsKKwkJCQkgICAgICBUWF9ERVNDX0FMSUdORURfU0laRSkpIHsKKwkJCS8qIHRoaXMgaXMgaW5zaWRlIGZvciBsb29wICovCisJCQlpZiAocF90eF9jdXJyX2Rlc2MtPnJldHVybl9pbmZvICE9IDApIHsKKwkJCQlwX3R4X2N1cnJfZGVzYy0+cmV0dXJuX2luZm8gPSAwOworCQkJCURQIChwcmludGYgKCJmcmVlZFxuIikpOworCQkJfQorCQl9CisJCURQIChwcmludGYgKCJEb25lXG4iKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12NjQ0NjBfZXRoX2ZyZWVfcnhfcmluZ3MgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IHF1ZXVlOworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfY3Vycl9kZXNjOworCisJZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwlwb3J0X3ByaXZhdGUgPQorCQkoc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9wcml2YXRlOworCXBvcnRfbnVtID0gcG9ydF9wcml2YXRlLT5wb3J0X251bTsKKworCisJLyogU3RvcCBSWCBRdWV1ZXMgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcgKHBvcnRfbnVtKSwKKwkJICAgICAgMHgwMDAwZmYwMCk7CisKKwkvKiBGcmVlIFJYIHJpbmdzICovCisJRFAgKHByaW50ZiAoIkNsZWFyaW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIFJYIHF1ZXVlcy4uLiAiKSk7CisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTVY2NDQ2MF9SWF9RVUVVRV9OVU07IHF1ZXVlKyspIHsKKwkJLyogRnJlZSBwcmVhbGxvY2F0ZWQgc2tiJ3Mgb24gUlggcmluZ3MgKi8KKwkJZm9yIChwX3J4X2N1cnJfZGVzYyA9CisJCSAgICAgZXRoZXJuZXRfcHJpdmF0ZS0+cF9yeF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV07CisJCSAgICAgKCgodW5zaWduZWQgaW50KSBwX3J4X2N1cnJfZGVzYyA8CisJCSAgICAgICAoKHVuc2lnbmVkIGludCkgZXRoZXJuZXRfcHJpdmF0ZS0+CisJCQlwX3J4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSArCisJCQlldGhlcm5ldF9wcml2YXRlLT5yeF9kZXNjX2FyZWFfc2l6ZVtxdWV1ZV0pKSk7CisJCSAgICAgcF9yeF9jdXJyX2Rlc2MgPQorCQkgICAgIChFVEhfUlhfREVTQyAqKSAoKHVuc2lnbmVkIGludCkgcF9yeF9jdXJyX2Rlc2MgKworCQkJCSAgICAgIFJYX0RFU0NfQUxJR05FRF9TSVpFKSkgeworCQkJaWYgKHBfcnhfY3Vycl9kZXNjLT5yZXR1cm5faW5mbyAhPSAwKSB7CisJCQkJcF9yeF9jdXJyX2Rlc2MtPnJldHVybl9pbmZvID0gMDsKKwkJCQlEUCAocHJpbnRmICgiZnJlZWRcbiIpKTsKKwkJCX0KKwkJfQorCQlEUCAocHJpbnRmICgiRG9uZVxuIikpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX3N0b3AKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBjbG9zaW5nIHRoZSBuZXR3b3JrIGRldmljZS4KKyAqIEl0IHVwZGF0ZXMgdGhlIGhhcmR3YXJlLAorICogcmVsZWFzZSBhbGwgbWVtb3J5IHRoYXQgaG9sZHMgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgYW5kIHJlbGVhc2UgdGhlIElSUS4KKyAqIElucHV0IDogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOiB6ZXJvIGlmIHN1Y2Nlc3MgLCBub256ZXJvIGlmIGZhaWxzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgbXY2NDQ2MF9ldGhfc3RvcCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtOworCisJZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwlwb3J0X3ByaXZhdGUgPQorCQkoc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9wcml2YXRlOworCXBvcnRfbnVtID0gcG9ydF9wcml2YXRlLT5wb3J0X251bTsKKworCS8qIERpc2FibGUgYWxsIGdpZ0UgYWRkcmVzcyBkZWNvZGVyICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9CQVNFX0FERFJfRU5BQkxFX1JFRywgMHgzZik7CisJRFAgKHByaW50ZiAoIiVzIEV0aGVybmV0IHN0b3AgY2FsbGVkIC4uLiBcbiIsIF9fRlVOQ1RJT05fXykpOworCW12NjQ0NjBfZXRoX3JlYWxfc3RvcCAoZGV2KTsKKworCXJldHVybiAwOworfTsKKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBtdjY0NDYwX2V0aF9zdG9wICovCisKK3N0YXRpYyBpbnQgbXY2NDQ2MF9ldGhfcmVhbF9zdG9wIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCisKKwltdjY0NDYwX2V0aF9mcmVlX3R4X3JpbmdzIChkZXYpOworCW12NjQ0NjBfZXRoX2ZyZWVfcnhfcmluZ3MgKGRldik7CisKKwlldGhfcG9ydF9yZXNldCAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0pOworCS8qIERpc2FibGUgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHIChwb3J0X251bSksIDApOworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcgKHBvcnRfbnVtKSwgMCk7CisJLyogTWFzayBSWCBidWZmZXIgYW5kIFRYIGVuZCBpbnRlcnJ1cHQgKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyAocG9ydF9udW0pLCAwKTsKKwkvKiBNYXNrIHBoeSBhbmQgbGluayBzdGF0dXMgY2hhbmdlcyBpbnRlcnJ1cHRzICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHIChwb3J0X251bSksIDApOworCU1WX1JFU0VUX1JFR19CSVRTIChNVjY0NDYwX0NQVV9JTlRFUlJVUFQwX01BU0tfSElHSCwKKwkJCSAgIEJJVDAgPDwgcG9ydF9udW0pOworCS8qIFByaW50IE5ldHdvcmsgc3RhdGlzdGljcyAqLworI2lmbmRlZiAgVVBEQVRFX1NUQVRTX0JZX1NPRlRXQVJFCisJLyoKKwkgKiBQcmludCBzdGF0aXN0aWNzIChvbmx5IGlmIGV0aGVybmV0IGlzIHJ1bm5pbmcpLAorCSAqIHRoZW4gemVybyBhbGwgdGhlIHN0YXRzIGZpZWxkcyBpbiBtZW1vcnkKKwkgKi8KKwlpZiAocG9ydF9wcml2YXRlLT5ldGhfcnVubmluZyA9PSBNQUdJQ19FVEhfUlVOTklORykgeworCQlwb3J0X3ByaXZhdGUtPmV0aF9ydW5uaW5nID0gMDsKKwkJbXY2NDQ2MF9ldGhfcHJpbnRfc3RhdCAoZGV2KTsKKwl9CisJbWVtc2V0IChwb3J0X3ByaXZhdGUtPnN0YXRzLCAwLCBzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisjZW5kaWYKKwlEUCAocHJpbnRmICgiXG5FdGhlcm5ldCBzdG9wcGVkIC4uLiBcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDQ2MF9ldGhfc3RhcnRfeG1pdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcXVldWVzIGEgcGFja2V0IGluIHRoZSBUeCBkZXNjcmlwdG9yIGZvcgorICogcmVxdWlyZWQgcG9ydC4KKyAqCisgKiBJbnB1dCA6IHNrYiAtIGEgcG9pbnRlciB0byBzb2NrZXQgYnVmZmVyCisgKiAgICAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgcmVxdWlyZWQgcG9ydAorICoKKyAqIE91dHB1dCA6IHplcm8gdXBvbiBzdWNjZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG12NjQ0NjBfZXRoX3htaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYsIHZvbGF0aWxlIHZvaWQgKmRhdGFQdHIsCisJCSAgICAgIGludCBkYXRhU2l6ZSkKK3sKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtOworCVBLVF9JTkZPIHBrdF9pbmZvOworCUVUSF9GVU5DX1JFVF9TVEFUVVMgc3RhdHVzOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwlFVEhfRlVOQ19SRVRfU1RBVFVTIHJlbGVhc2VfcmVzdWx0OworCisJZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwlwb3J0X3ByaXZhdGUgPQorCQkoc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9wcml2YXRlOworCXBvcnRfbnVtID0gcG9ydF9wcml2YXRlLT5wb3J0X251bTsKKworCXN0YXRzID0gcG9ydF9wcml2YXRlLT5zdGF0czsKKworCS8qIFVwZGF0ZSBwYWNrZXQgaW5mbyBkYXRhIHN0cnVjdHVyZSAqLworCXBrdF9pbmZvLmNtZF9zdHMgPSBFVEhfVFhfRklSU1RfREVTQyB8IEVUSF9UWF9MQVNUX0RFU0M7CS8qIERNQSBvd25lZCwgZmlyc3QgbGFzdCAqLworCXBrdF9pbmZvLmJ5dGVfY250ID0gZGF0YVNpemU7CisJcGt0X2luZm8uYnVmX3B0ciA9ICh1bnNpZ25lZCBpbnQpIGRhdGFQdHI7CisKKwlzdGF0dXMgPSBldGhfcG9ydF9zZW5kIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsICZwa3RfaW5mbyk7CisJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSB8fCAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKSkgeworCQlwcmludGYgKCJFcnJvciBvbiB0cmFuc21pdHRpbmcgcGFja2V0IC4uIik7CisJCWlmIChzdGF0dXMgPT0gRVRIX1FVRVVFX0ZVTEwpCisJCQlwcmludGYgKCJFVEggUXVldWUgaXMgZnVsbC4gXG4iKTsKKwkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRSkKKwkJCXByaW50ZiAoIkVUSCBRdWV1ZTogdXNpbmcgbGFzdCBhdmFpbGFibGUgcmVzb3VyY2UuIFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogVXBkYXRlIHN0YXRpc3RpY3MgYW5kIHN0YXJ0IG9mIHRyYW5zbWl0dGlvbiB0aW1lICovCisJc3RhdHMtPnR4X2J5dGVzICs9IGRhdGFTaXplOworCXN0YXRzLT50eF9wYWNrZXRzKys7CisKKwkvKiBDaGVjayBpZiBwYWNrZXQocykgaXMoYXJlKSB0cmFuc21pdHRlZCBjb3JyZWN0bHkgKHJlbGVhc2UgZXZlcnl0aGluZykgKi8KKwlkbyB7CisJCXJlbGVhc2VfcmVzdWx0ID0KKwkJCWV0aF90eF9yZXR1cm5fZGVzYyAoZXRoZXJuZXRfcHJpdmF0ZSwgRVRIX1EwLAorCQkJCQkgICAgJnBrdF9pbmZvKTsKKwkJc3dpdGNoIChyZWxlYXNlX3Jlc3VsdCkgeworCQljYXNlIEVUSF9PSzoKKwkJCURQIChwcmludGYgKCJkZXNjcmlwdG9yIHJlbGVhc2VkXG4iKSk7CisJCQlpZiAocGt0X2luZm8uY21kX3N0cyAmIEJJVDApIHsKKwkJCQlwcmludGYgKCJFcnJvciBpbiBUWFxuIik7CisJCQkJc3RhdHMtPnR4X2Vycm9ycysrOworCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBFVEhfUkVUUlk6CisJCQlEUCAocHJpbnRmICgidHJhbnNtaXNzaW9uIHN0aWxsIGluIHByb2Nlc3NcbiIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVRIX0VSUk9SOgorCQkJcHJpbnRmICgicm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmdcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVEhfRU5EX09GX0pPQjoKKwkJCURQIChwcmludGYgKCJ0aGUgcm91dGluZSBoYXMgbm90aGluZyB0byByZWxlYXNlXG4iKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmVsZWFzZV9yZXN1bHQgPT0gRVRIX09LKTsKKworCisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCisgICAgICBlcnJvcjoKKwlyZXR1cm4gMTsJCS8qIEZhaWxlZCAtIGhpZ2hlciBsYXllcnMgd2lsbCBmcmVlIHRoZSBza2IgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX3JlY2VpdmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvcndhcmQgcGFja2V0cyB0aGF0IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBwb3J0J3MKKyAqIHF1ZXVlcyB0b3dhcmQga2VybmVsIGNvcmUgb3IgRmFzdFJvdXRlIHRoZW0gdG8gYW5vdGhlciBpbnRlcmZhY2UuCisgKgorICogSW5wdXQgOiBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZQorICogICAgICAgICBtYXggLSBtYXhpbXVtIG51bWJlciB0byByZWNlaXZlICgwIG1lYW5zIHVubGltdGVkKQorICoKKyAqIE91dHB1dCA6IG51bWJlciBvZiBzZXJ2ZWQgcGFja2V0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtdjY0NDYwX2V0aF9yZWNlaXZlIChzdHJ1Y3QgZXRoX2RldmljZSAqZGV2KQoreworCUVUSF9QT1JUX0lORk8gKmV0aGVybmV0X3ByaXZhdGU7CisJc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKnBvcnRfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisJUEtUX0lORk8gcGt0X2luZm87CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCXN0YXRzID0gcG9ydF9wcml2YXRlLT5zdGF0czsKKworCXdoaWxlICgoZXRoX3BvcnRfcmVjZWl2ZSAoZXRoZXJuZXRfcHJpdmF0ZSwgRVRIX1EwLCAmcGt0X2luZm8pID09CisJCUVUSF9PSykpIHsKKworI2lmZGVmIERFQlVHX01WX0VUSAorCQlpZiAocGt0X2luZm8uYnl0ZV9jbnQgIT0gMCkgeworCQkJcHJpbnRmICgiJXM6IFJlY2VpdmVkICVkIGJ5dGUgUGFja2V0IEAgMHgleFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHBrdF9pbmZvLmJ5dGVfY250LAorCQkJCXBrdF9pbmZvLmJ1Zl9wdHIpOworCQl9CisjZW5kaWYKKwkJLyogVXBkYXRlIHN0YXRpc3RpY3MuIE5vdGUgYnl0ZSBjb3VudCBpbmNsdWRlcyA0IGJ5dGUgQ1JDIGNvdW50ICovCisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBwa3RfaW5mby5ieXRlX2NudDsKKworCQkvKgorCQkgKiBJbiBjYXNlIHJlY2VpdmVkIGEgcGFja2V0IHdpdGhvdXQgZmlyc3QgLyBsYXN0IGJpdHMgb24gT1IgdGhlIGVycm9yCisJCSAqIHN1bW1hcnkgYml0IGlzIG9uLCB0aGUgcGFja2V0cyBuZWVkcyB0byBiZSBkcm9wZWVkLgorCQkgKi8KKwkJaWYgKCgocGt0X2luZm8uCisJCSAgICAgIGNtZF9zdHMgJiAoRVRIX1JYX0ZJUlNUX0RFU0MgfCBFVEhfUlhfTEFTVF9ERVNDKSkgIT0KKwkJICAgICAoRVRIX1JYX0ZJUlNUX0RFU0MgfCBFVEhfUlhfTEFTVF9ERVNDKSkKKwkJICAgIHx8IChwa3RfaW5mby5jbWRfc3RzICYgRVRIX0VSUk9SX1NVTU1BUlkpKSB7CisJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJCQlwcmludGYgKCJSZWNlaXZlZCBwYWNrZXQgc3ByZWFkIG9uIG11bHRpcGxlIGRlc2NyaXB0b3JzXG4iKTsKKworCQkJLyogSXMgdGhpcyBjYXVzZWQgYnkgYW4gZXJyb3IgPyAqLworCQkJaWYgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfRVJST1JfU1VNTUFSWSkgeworCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCX0KKworCQkJLyogZnJlZSB0aGVzZSBkZXNjcmlwdG9ycyBhZ2FpbiB3aXRob3V0IGZvcndhcmRpbmcgdGhlbSB0byB0aGUgaGlnaGVyIGxheWVycyAqLworCQkJcGt0X2luZm8uYnVmX3B0ciAmPSB+MHg3OwkvKiByZWFsaWduIGJ1ZmZlciBhZ2FpbiAqLworCQkJcGt0X2luZm8uYnl0ZV9jbnQgPSAweDAwMDA7CS8qIFJlc2V0IEJ5dGUgY291bnQgKi8KKworCQkJaWYgKGV0aF9yeF9yZXR1cm5fYnVmZgorCQkJICAgIChldGhlcm5ldF9wcml2YXRlLCBFVEhfUTAsICZwa3RfaW5mbykgIT0gRVRIX09LKSB7CisJCQkJcHJpbnRmICgiRXJyb3Igd2hpbGUgcmV0dXJuaW5nIHRoZSBSWCBEZXNjIHRvIFJpbmdcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlEUCAocHJpbnRmICgiUlggRGVzYyByZXR1cm5lZCB0byBSaW5nXG4iKSk7CisJCQl9CisJCQkvKiAvZnJlZSB0aGVzZSBkZXNjcmlwdG9ycyBhZ2FpbiAqLworCQl9IGVsc2UgeworCisvKiAhISEgY2FsbCBoaWdoZXIgbGF5ZXIgcHJvY2Vzc2luZyAqLworI2lmZGVmIERFQlVHX01WX0VUSAorCQkJcHJpbnRmICgiXG5Ob3cgc2VuZCBpdCB0byB1cHBlciBsYXllciBwcm90b2NvbHMgKE5ldFJlY2VpdmUpIC4uLlxuIik7CisjZW5kaWYKKwkJCS8qIGxldCB0aGUgdXBwZXIgbGF5ZXIgaGFuZGxlIHRoZSBwYWNrZXQgKi8KKwkJCU5ldFJlY2VpdmUgKCh1Y2hhciAqKSBwa3RfaW5mby5idWZfcHRyLAorCQkJCSAgICAoaW50KSBwa3RfaW5mby5ieXRlX2NudCk7CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qIGZyZWUgZGVzY3JpcHRvciAgKi8KKwkJCXBrdF9pbmZvLmJ1Zl9wdHIgJj0gfjB4NzsJLyogcmVhbGlnbiBidWZmZXIgYWdhaW4gKi8KKwkJCXBrdF9pbmZvLmJ5dGVfY250ID0gMHgwMDAwOwkvKiBSZXNldCBCeXRlIGNvdW50ICovCisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJSWDogcGt0X2luZm8uYnVmX3B0ciA9CSV4XG4iLAorCQkJICAgICBwa3RfaW5mby5idWZfcHRyKSk7CisJCQlpZiAoZXRoX3J4X3JldHVybl9idWZmCisJCQkgICAgKGV0aGVybmV0X3ByaXZhdGUsIEVUSF9RMCwgJnBrdF9pbmZvKSAhPSBFVEhfT0spIHsKKwkJCQlwcmludGYgKCJFcnJvciB3aGlsZSByZXR1cm5pbmcgdGhlIFJYIERlc2MgdG8gUmluZ1xuIik7CisJCQl9IGVsc2UgeworCQkJCURQIChwcmludGYgKCJSWCBEZXNjIHJldHVybmVkIHRvIFJpbmdcbiIpKTsKKwkJCX0KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisJCX0KKwl9CisJbXY2NDQ2MF9ldGhfZ2V0X3N0YXRzIChkZXYpOwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXY2NDQ2MF9ldGhfZ2V0X3N0YXRzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICoKKyAqIElucHV0IDogZGV2IC0gYSBwb2ludGVyIHRvIHRoZSByZXF1aXJlZCBpbnRlcmZhY2UKKyAqCisgKiBPdXRwdXQgOiBhIHBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSdzIHN0YXRpc3RpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm12NjQ0NjBfZXRoX2dldF9zdGF0cyAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtOworCisJZXRoZXJuZXRfcHJpdmF0ZSA9IChFVEhfUE9SVF9JTkZPICopIGRldi0+cHJpdjsKKwlwb3J0X3ByaXZhdGUgPQorCQkoc3RydWN0IG12NjQ0NjBfZXRoX3ByaXYgKikgZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9wcml2YXRlOworCXBvcnRfbnVtID0gcG9ydF9wcml2YXRlLT5wb3J0X251bTsKKworCW12NjQ0NjBfZXRoX3VwZGF0ZV9zdGF0IChkZXYpOworCisJcmV0dXJuIHBvcnRfcHJpdmF0ZS0+c3RhdHM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX3VwZGF0ZV9zdGF0CisgKgorICogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpbiB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIElucHV0IDogcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOiBOL0EKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBtdjY0NDYwX2V0aF91cGRhdGVfc3RhdCAoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKwlFVEhfUE9SVF9JTkZPICpldGhlcm5ldF9wcml2YXRlOworCXN0cnVjdCBtdjY0NDYwX2V0aF9wcml2ICpwb3J0X3ByaXZhdGU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCXVuc2lnbmVkIGludCBwb3J0X251bTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZHVtbXk7CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCXN0YXRzID0gcG9ydF9wcml2YXRlLT5zdGF0czsKKworCS8qIFRoZXNlIGFyZSBmYWxzZSB1cGRhdGVzICovCisJc3RhdHMtPnJ4X3BhY2tldHMgKz0gKHVuc2lnbmVkIGxvbmcpCisJCWV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSwKKwkJCQkgICAgICBFVEhfTUlCX0dPT0RfRlJBTUVTX1JFQ0VJVkVEKTsKKwlzdGF0cy0+dHhfcGFja2V0cyArPSAodW5zaWduZWQgbG9uZykKKwkJZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtLAorCQkJCSAgICAgIEVUSF9NSUJfR09PRF9GUkFNRVNfU0VOVCk7CisJc3RhdHMtPnJ4X2J5dGVzICs9ICh1bnNpZ25lZCBsb25nKQorCQlldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1cpOworCS8qCisJICogSWRlYWxseSB0aGlzIHNob3VsZCBiZSBhcyBmb2xsb3dzIC0KKwkgKgorCSAqICAgc3RhdHMtPnJ4X2J5dGVzICAgKz0gc3RhdHMtPnJ4X2J5dGVzICsKKwkgKiAoKHVuc2lnbmVkIGxvbmcpIGV0aFJlYWRNaWJDb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSAsCisJICogRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdIKSA8PCAzMik7CisJICoKKwkgKiBCdXQgdGhlIHVuc2lnbmVkIGxvbmcgaW4gUG93ZXJQQyBhbmQgTUlQUyBhcmUgMzJiaXQuIFNvIHRoZSBuZXh0IHJlYWQKKwkgKiBpcyBqdXN0IGEgZHVtbXkgcmVhZCBmb3IgcHJvcGVyIHdvcmsgb2YgdGhlIEdpZ0UgcG9ydAorCSAqLworCWR1bW15ID0gZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtLAorCQkJCSAgICAgIEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfSElHSCk7CisJc3RhdHMtPnR4X2J5dGVzICs9ICh1bnNpZ25lZCBsb25nKQorCQlldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9HT09EX09DVEVUU19TRU5UX0xPVyk7CisJZHVtbXkgPSBldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+cG9ydF9udW0sCisJCQkJICAgICAgRVRIX01JQl9HT09EX09DVEVUU19TRU5UX0hJR0gpOworCXN0YXRzLT5yeF9lcnJvcnMgKz0gKHVuc2lnbmVkIGxvbmcpCisJCWV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT5wb3J0X251bSwKKwkJCQkgICAgICBFVEhfTUlCX01BQ19SRUNFSVZFX0VSUk9SKTsKKworCS8qIFJ4IGRyb3BwZWQgaXMgZm9yIHJlY2VpdmVkIHBhY2tldCB3aXRoIENSQyBlcnJvciAqLworCXN0YXRzLT5yeF9kcm9wcGVkICs9CisJCSh1bnNpZ25lZCBsb25nKSBldGhfcmVhZF9taWJfY291bnRlciAoZXRoZXJuZXRfcHJpdmF0ZS0+CisJCQkJCQkgICAgICBwb3J0X251bSwKKwkJCQkJCSAgICAgIEVUSF9NSUJfQkFEX0NSQ19FVkVOVCk7CisJc3RhdHMtPm11bHRpY2FzdCArPSAodW5zaWduZWQgbG9uZykKKwkJZXRoX3JlYWRfbWliX2NvdW50ZXIgKGV0aGVybmV0X3ByaXZhdGUtPnBvcnRfbnVtLAorCQkJCSAgICAgIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19SRUNFSVZFRCk7CisJc3RhdHMtPmNvbGxpc2lvbnMgKz0KKwkJKHVuc2lnbmVkIGxvbmcpIGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT4KKwkJCQkJCSAgICAgIHBvcnRfbnVtLAorCQkJCQkJICAgICAgRVRIX01JQl9DT0xMSVNJT04pICsKKwkJKHVuc2lnbmVkIGxvbmcpIGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT4KKwkJCQkJCSAgICAgIHBvcnRfbnVtLAorCQkJCQkJICAgICAgRVRIX01JQl9MQVRFX0NPTExJU0lPTik7CisJLyogZGV0YWlsZWQgcnggZXJyb3JzICovCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0KKwkJKHVuc2lnbmVkIGxvbmcpIGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT4KKwkJCQkJCSAgICAgIHBvcnRfbnVtLAorCQkJCQkJICAgICAgRVRIX01JQl9VTkRFUlNJWkVfUkVDRUlWRUQpCisJCSsKKwkJKHVuc2lnbmVkIGxvbmcpIGV0aF9yZWFkX21pYl9jb3VudGVyIChldGhlcm5ldF9wcml2YXRlLT4KKwkJCQkJCSAgICAgIHBvcnRfbnVtLAorCQkJCQkJICAgICAgRVRIX01JQl9PVkVSU0laRV9SRUNFSVZFRCk7CisJLyogZGV0YWlsZWQgdHggZXJyb3JzICovCit9CisKKyNpZm5kZWYgIFVQREFURV9TVEFUU19CWV9TT0ZUV0FSRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12NjQ0NjBfZXRoX3ByaW50X3N0YXQKKyAqCisgKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGluIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKgorICogSW5wdXQgOiBwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6IE4vQQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG12NjQ0NjBfZXRoX3ByaW50X3N0YXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJRVRIX1BPUlRfSU5GTyAqZXRoZXJuZXRfcHJpdmF0ZTsKKwlzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqcG9ydF9wcml2YXRlOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKKwl1bnNpZ25lZCBpbnQgcG9ydF9udW07CisKKwlldGhlcm5ldF9wcml2YXRlID0gKEVUSF9QT1JUX0lORk8gKikgZGV2LT5wcml2OworCXBvcnRfcHJpdmF0ZSA9CisJCShzdHJ1Y3QgbXY2NDQ2MF9ldGhfcHJpdiAqKSBldGhlcm5ldF9wcml2YXRlLT5wb3J0X3ByaXZhdGU7CisJcG9ydF9udW0gPSBwb3J0X3ByaXZhdGUtPnBvcnRfbnVtOworCXN0YXRzID0gcG9ydF9wcml2YXRlLT5zdGF0czsKKworCS8qIFRoZXNlIGFyZSBmYWxzZSB1cGRhdGVzICovCisJcHJpbnRmICgiXG4jIyMgTmV0d29yayBzdGF0aXN0aWNzOiAjIyNcbiIpOworCXByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGYgKCIgUGFja2V0cyByZWNlaXZlZDoJCSVsZFxuIiwgc3RhdHMtPnJ4X3BhY2tldHMpOworCXByaW50ZiAoIiBQYWNrZXRzIHNlbmQ6CQkJJWxkXG4iLCBzdGF0cy0+dHhfcGFja2V0cyk7CisJcHJpbnRmICgiIFJlY2VpdmVkIGJ5dGVzOgkJJWxkXG4iLCBzdGF0cy0+cnhfYnl0ZXMpOworCXByaW50ZiAoIiBTZW5kIGJ5dGVzOgkJCSVsZFxuIiwgc3RhdHMtPnR4X2J5dGVzKTsKKwlpZiAoc3RhdHMtPnJ4X2Vycm9ycyAhPSAwKQorCQlwcmludGYgKCIgUnggRXJyb3JzOgkJCSVsZFxuIiwKKwkJCXN0YXRzLT5yeF9lcnJvcnMpOworCWlmIChzdGF0cy0+cnhfZHJvcHBlZCAhPSAwKQorCQlwcmludGYgKCIgUnggZHJvcHBlZCAoQ1JDIEVycm9ycyk6CSVsZFxuIiwKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKTsKKwlpZiAoc3RhdHMtPm11bHRpY2FzdCAhPSAwKQorCQlwcmludGYgKCIgUnggbXVsaWNhc3QgZnJhbWVzOgkJJWxkXG4iLAorCQkJc3RhdHMtPm11bHRpY2FzdCk7CisJaWYgKHN0YXRzLT5jb2xsaXNpb25zICE9IDApCisJCXByaW50ZiAoIiBOby4gb2YgY29sbGlzaW9uczoJCSVsZFxuIiwKKwkJCXN0YXRzLT5jb2xsaXNpb25zKTsKKwlpZiAoc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgIT0gMCkKKwkJcHJpbnRmICgiIFJ4IGxlbmd0aCBlcnJvcnM6CQklbGRcbiIsCisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyk7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKm5ldHdvcmtfc3RhcnQgLSBOZXR3b3JrIEtpY2sgT2ZmIFJvdXRpbmUgVUJvb3QKKyAqSW5wdXRzIDoKKyAqT3V0cHV0cyA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Jvb2wgZGI2NDQ2MF9ldGhfc3RhcnQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChtdjY0NDYwX2V0aF9vcGVuIChkZXYpKTsJLyogY2FsbHMgcmVhbCBvcGVuICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFRoZSBzZWNvbmQgcGFydCBpcyB0aGUgbG93IGxldmVsIGRyaXZlciBvZiB0aGUgZ2lnRSBldGhlcm5ldCBwb3J0cy4gICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYmFzZWQgb24gTGludXggY29kZQorICogYXJjaC9wcGMvZ2FsaWxlby9FVkI2NDQ2MC9tdjY0NDYwX2V0aC5jIC0gRHJpdmVyIGZvciBNVjY0NDYwWCBldGhlcm5ldCBwb3J0cworICogQ29weXJpZ2h0IChDKSAyMDAyIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFydmVsbCdzIEdpZ2FiaXQgRXRoZXJuZXQgY29udHJvbGxlciBsb3cgbGV2ZWwgZHJpdmVyCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZpbGUgaW50cm9kdWNlIGxvdyBsZXZlbCBBUEkgdG8gTWFydmVsbCdzIEdpZ2FiaXQgRXRoZXJuZXQKKyAqCQljb250cm9sbGVyLiBUaGlzIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlciBkcml2ZXIgQVBJIGNvbnRyb2xzCisgKgkJMSkgT3BlcmF0aW9ucyAoaS5lLiBwb3J0IGluaXQsIHN0YXJ0LCByZXNldCBldGMnKS4KKyAqCQkyKSBEYXRhIGZsb3cgKGkuZS4gcG9ydCBzZW5kLCByZWNlaXZlIGV0YycpLgorICoJCUVhY2ggR2lnYWJpdCBFdGhlcm5ldCBwb3J0IGlzIGNvbnRyb2xsZWQgdmlhIEVUSF9QT1JUX0lORk8KKyAqCQlzdHJ1Y3QuCisgKgkJVGhpcyBzdHJ1Y3QgaW5jbHVkZXMgdXNlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMKKyAqCQlkcml2ZXIgaW50ZXJuYWwgZGF0YSBuZWVkZWQgZm9yIGl0cyBvcGVyYXRpb25zLgorICoKKyAqCQlTdXBwb3J0ZWQgRmVhdHVyZXM6CisgKgkJLSBUaGlzIGxvdyBsZXZlbCBkcml2ZXIgaXMgT1MgaW5kZXBlbmRlbnQuIEFsbG9jYXRpbmcgbWVtb3J5IGZvcgorICoJCSAgdGhlIGRlc2NyaXB0b3IgcmluZ3MgYW5kIGJ1ZmZlcnMgYXJlIG5vdCB3aXRoaW4gdGhlIHNjb3BlIG9mCisgKgkJICB0aGlzIGRyaXZlci4KKyAqCQktIFRoZSB1c2VyIGlzIGZyZWUgZnJvbSBSeC9UeCBxdWV1ZSBtYW5hZ2luZy4KKyAqCQktIFRoaXMgbG93IGxldmVsIGRyaXZlciBpbnRyb2R1Y2UgZnVuY3Rpb25hbGl0eSBBUEkgdGhhdCBlbmFibGUKKyAqCQkgIHRoZSB0byBvcGVyYXRlIE1hcnZlbGwncyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgaW4gYQorICoJCSAgY29udmVuaWVudCB3YXkuCisgKgkJLSBTaW1wbGUgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IG9wZXJhdGlvbiBBUEkuCisgKgkJLSBTaW1wbGUgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IGRhdGEgZmxvdyBBUEkuCisgKgkJLSBEYXRhIGZsb3cgYW5kIG9wZXJhdGlvbiBBUEkgc3VwcG9ydCBwZXIgcXVldWUgZnVuY3Rpb25hbGl0eS4KKyAqCQktIFN1cHBvcnQgY2FjaGVkIGRlc2NyaXB0b3JzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgKgkJLSBFbmFibGUgYWNjZXNzIHRvIGFsbCBmb3VyIERSQU0gYmFua3MgYW5kIGludGVybmFsIFNSQU0gbWVtb3J5CisgKgkJICBzcGFjZXMuCisgKgkJLSBQSFkgYWNjZXNzIGFuZCBjb250cm9sIEFQSS4KKyAqCQktIFBvcnQgY29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uIEFQSS4KKyAqCQktIEZ1bGwgY29udHJvbCBvdmVyIFVuaWNhc3QgYW5kIE11bHRpY2FzdCBNQUMgY29uZmlndXJhdGlvbnMuCisgKgorICoJCU9wZXJhdGlvbiBmbG93OgorICoKKyAqCQlJbml0aWFsaXphdGlvbiBwaGFzZQorICoJCVRoaXMgcGhhc2UgY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBFVEhfUE9SVF9JTkZPCisgKgkJc3RydWN0LgorICoJCVVzZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBvcnQgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgc2V0CisgKgkJcHJpb3IgdG8gY2FsbGluZyB0aGUgcG9ydCBpbml0aWFsaXphdGlvbiByb3V0aW5lLiBGb3IgZXhhbXBsZSwKKyAqCQl0aGUgdXNlciBoYXMgdG8gYXNzaWduIHRoZSBwb3J0X3BoeV9hZGRyIGZpZWxkIHdoaWNoIGlzIGJvYXJkCisgKgkJZGVwZW5kZWQgcGFyYW1ldGVyLgorICoJCUluIHRoaXMgcGhhc2UgYW55IHBvcnQgVHgvUnggYWN0aXZpdHkgaXMgaGFsdGVkLCBNSUIgY291bnRlcnMKKyAqCQlhcmUgY2xlYXJlZCwgUEhZIGFkZHJlc3MgaXMgc2V0IGFjY29yZGluZyB0byB1c2VyIHBhcmFtZXRlciBhbmQKKyAqCQlhY2Nlc3MgdG8gRFJBTSBhbmQgaW50ZXJuYWwgU1JBTSBtZW1vcnkgc3BhY2VzLgorICoKKyAqCQlEcml2ZXIgcmluZyBpbml0aWFsaXphdGlvbgorICoJCUFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvciByaW5ncyBhbmQgYnVmZmVycyBpcyBub3QKKyAqCQl3aXRoaW4gdGhlIHNjb3BlIG9mIHRoaXMgZHJpdmVyLiBUaHVzLCB0aGUgdXNlciBpcyByZXF1aXJlZCB0bworICoJCWFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3JzIHJpbmcgYW5kIGJ1ZmZlcnMuIFRob3NlCisgKgkJbWVtb3J5IHBhcmFtZXRlcnMgYXJlIHVzZWQgYnkgdGhlIFJ4IGFuZCBUeCByaW5nIGluaXRpYWxpemF0aW9uCisgKgkJcm91dGluZXMgaW4gb3JkZXIgdG8gY3VydmUgdGhlIGRlc2NyaXB0b3IgbGlua2VkIGxpc3QgaW4gYSBmb3JtCisgKgkJb2YgYSByaW5nLgorICoJCU5vdGU6IFBheSBzcGVjaWFsIGF0dGVudGlvbiB0byBhbGlnbm1lbnQgaXNzdWVzIHdoZW4gdXNpbmcKKyAqCQljYWNoZWQgZGVzY3JpcHRvcnMvYnVmZmVycy4gSW4gdGhpcyBwaGFzZSB0aGUgZHJpdmVyIHN0b3JlCisgKgkJaW5mb3JtYXRpb24gaW4gdGhlIEVUSF9QT1JUX0lORk8gc3RydWN0IHJlZ2FyZGluZyBlYWNoIHF1ZXVlCisgKgkJcmluZy4KKyAqCisgKgkJRHJpdmVyIHN0YXJ0CisgKgkJVGhpcyBwaGFzZSBwcmVwYXJlcyB0aGUgRXRoZXJuZXQgcG9ydCBmb3IgUnggYW5kIFR4IGFjdGl2aXR5LgorICoJCUl0IHVzZXMgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgRVRIX1BPUlRfSU5GTyBzdHJ1Y3QgdG8KKyAqCQlpbml0aWFsaXplIHRoZSB2YXJpb3VzIHBvcnQgcmVnaXN0ZXJzLgorICoKKyAqCQlEYXRhIGZsb3c6CisgKgkJQWxsIHBhY2tldCByZWZlcmVuY2VzIHRvL2Zyb20gdGhlIGRyaXZlciBhcmUgZG9uZSB1c2luZyBQS1RfSU5GTworICoJCXN0cnVjdC4KKyAqCQlUaGlzIHN0cnVjdCBpcyBhIHVuaWZpZWQgc3RydWN0IHVzZWQgd2l0aCBSeCBhbmQgVHggb3BlcmF0aW9ucy4KKyAqCQlUaGlzIHdheSB0aGUgdXNlciBpcyBub3QgcmVxdWlyZWQgdG8gYmUgZmFtaWxpYXIgd2l0aCBuZWl0aGVyCisgKgkJVHggbm9yIFJ4IGRlc2NyaXB0b3JzIHN0cnVjdHVyZXMuCisgKgkJVGhlIGRyaXZlcidzIGRlc2NyaXB0b3JzIHJpbmdzIGFyZSBtYW5hZ2VtZW50IGJ5IGluZGV4ZXMuCisgKgkJVGhvc2UgaW5kZXhlcyBjb250cm9scyB0aGUgcmluZyByZXNvdXJjZXMgYW5kIHVzZWQgdG8gaW5kaWNhdGUKKyAqCQlhIFNXIHJlc291cmNlIGVycm9yOgorICoJCSdjdXJyZW50JworICoJCVRoaXMgaW5kZXggcG9pbnRzIHRvIHRoZSBjdXJyZW50IGF2YWlsYWJsZSByZXNvdXJjZSBmb3IgdXNlLiBGb3IKKyAqCQlleGFtcGxlIGluIFJ4IHByb2Nlc3MgdGhpcyBpbmRleCB3aWxsIHBvaW50IHRvIHRoZSBkZXNjcmlwdG9yCisgKgkJdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdXNlciB1cG9uIGNhbGxpbmcgdGhlIHJlY2VpdmUgcm91dGluZS4KKyAqCQlJbiBUeCBwcm9jZXNzLCB0aGlzIGluZGV4IHdpbGwgcG9pbnQgdG8gdGhlIGRlc2NyaXB0b3IKKyAqCQl0aGF0IHdpbGwgYmUgYXNzaWduZWQgd2l0aCB0aGUgdXNlciBwYWNrZXQgaW5mbyBhbmQgdHJhbnNtaXR0ZWQuCisgKgkJJ3VzZWQnCisgKgkJVGhpcyBpbmRleCBwb2ludHMgdG8gdGhlIGRlc2NyaXB0b3IgdGhhdCBuZWVkIHRvIHJlc3RvcmUgaXRzCisgKgkJcmVzb3VyY2VzLiBGb3IgZXhhbXBsZSBpbiBSeCBwcm9jZXNzLCB1c2luZyB0aGUgUnggYnVmZmVyIHJldHVybgorICoJCUFQSSB3aWxsIGF0dGFjaCB0aGUgYnVmZmVyIHJldHVybmVkIGluIHBhY2tldCBpbmZvIHRvIHRoZQorICoJCWRlc2NyaXB0b3IgcG9pbnRlZCBieSAndXNlZCcuIEluIFR4IHByb2Nlc3MsIHVzaW5nIHRoZSBUeAorICoJCWRlc2NyaXB0b3IgcmV0dXJuIHdpbGwgbWVyZWx5IHJldHVybiB0aGUgdXNlciBwYWNrZXQgaW5mbyB3aXRoCisgKgkJdGhlIGNvbW1hbmQgc3RhdHVzIG9mICB0aGUgdHJhbnNtaXR0ZWQgYnVmZmVyIHBvaW50ZWQgYnkgdGhlCisgKgkJJ3VzZWQnIGluZGV4LiBOZXZlcnRoZWxlc3MsIGl0IGlzIGVzc2VudGlhbCB0byB1c2UgdGhpcyByb3V0aW5lCisgKgkJdG8gdXBkYXRlIHRoZSAndXNlZCcgaW5kZXguCisgKgkJJ2ZpcnN0JworICoJCVRoaXMgaW5kZXggc3VwcG9ydHMgVHggU2NhdHRlci1HYXRoZXIuIEl0IHBvaW50cyB0byB0aGUgZmlyc3QKKyAqCQlkZXNjcmlwdG9yIG9mIGEgcGFja2V0IGFzc2VtYmxlZCBvZiBtdWx0aXBsZSBidWZmZXJzLiBGb3IgZXhhbXBsZQorICoJCXdoZW4gaW4gbWlkZGxlIG9mIFN1Y2ggcGFja2V0IHdlIGhhdmUgYSBUeCByZXNvdXJjZSBlcnJvciB0aGUKKyAqCQknY3VycicgaW5kZXggZ2V0IHRoZSB2YWx1ZSBvZiAnZmlyc3QnIHRvIGluZGljYXRlIHRoYXQgdGhlIHJpbmcKKyAqCQlyZXR1cm5lZCB0byBpdHMgc3RhdGUgYmVmb3JlIHRyeWluZyB0byB0cmFuc21pdCB0aGlzIHBhY2tldC4KKyAqCisgKgkJUmVjZWl2ZSBvcGVyYXRpb246CisgKgkJVGhlIGV0aF9wb3J0X3JlY2VpdmUgQVBJIHNldCB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdCwKKyAqCQlwYXNzZWQgYnkgdGhlIGNhbGxlciwgd2l0aCByZWNlaXZlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICoJCSdjdXJyZW50JyBTRE1BIGRlc2NyaXB0b3IuCisgKgkJSXQgaXMgdGhlIHVzZXIgcmVzcG9uc2liaWxpdHkgdG8gcmV0dXJuIHRoaXMgcmVzb3VyY2UgYmFjaworICoJCXRvIHRoZSBSeCBkZXNjcmlwdG9yIHJpbmcgdG8gZW5hYmxlIHRoZSByZXVzZSBvZiB0aGlzIHNvdXJjZS4KKyAqCQlSZXR1cm4gUnggcmVzb3VyY2UgaXMgZG9uZSB1c2luZyB0aGUgZXRoX3J4X3JldHVybl9idWZmIEFQSS4KKyAqCisgKgkJVHJhbnNtaXQgb3BlcmF0aW9uOgorICoJCVRoZSBldGhfcG9ydF9zZW5kIEFQSSBzdXBwb3J0cyBTY2F0dGVyLUdhdGhlciB3aGljaCBlbmFibGVzIHRvCisgKgkJc2VuZCBhIHBhY2tldCBzcGFubmVkIG92ZXIgbXVsdGlwbGUgYnVmZmVycy4gVGhpcyBtZWFucyB0aGF0CisgKgkJZm9yIGVhY2ggcGFja2V0IGluZm8gc3RydWN0dXJlIGdpdmVuIGJ5IHRoZSB1c2VyIGFuZCBwdXQgaW50bworICoJCXRoZSBUeCBkZXNjcmlwdG9ycyByaW5nLCB3aWxsIGJlIHRyYW5zbWl0dGVkIG9ubHkgaWYgdGhlICdMQVNUJworICoJCWJpdCB3aWxsIGJlIHNldCBpbiB0aGUgcGFja2V0IGluZm8gY29tbWFuZCBzdGF0dXMgZmllbGQuIFRoaXMKKyAqCQlBUEkgYWxzbyBjb25zaWRlciByZXN0cmljdGlvbiByZWdhcmRpbmcgYnVmZmVyIGFsaWdubWVudHMgYW5kCisgKgkJc2l6ZXMuCisgKgkJVGhlIHVzZXIgbXVzdCByZXR1cm4gYSBUeCByZXNvdXJjZSBhZnRlciBlbnN1cmluZyB0aGUgYnVmZmVyCisgKgkJaGFzIGJlZW4gdHJhbnNtaXR0ZWQgdG8gZW5hYmxlIHRoZSBUeCByaW5nIGluZGV4ZXMgdG8gdXBkYXRlLgorICoKKyAqCQlCT0FSRCBMQVlPVVQKKyAqCQlUaGlzIGRldmljZSBpcyBvbi1ib2FyZC4gIE5vIGp1bXBlciBkaWFncmFtIGlzIG5lY2Vzc2FyeS4KKyAqCisgKgkJRVhURVJOQUwgSU5URVJGQUNFCisgKgorICogICAgICAgUHJpb3IgdG8gY2FsbGluZyB0aGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBldGhfcG9ydF9pbml0KCkgdGhlIHVzZXIKKyAqCSBtdXN0IHNldCB0aGUgZm9sbG93aW5nIGZpZWxkcyB1bmRlciBFVEhfUE9SVF9JTkZPIHN0cnVjdDoKKyAqICAgICAgIHBvcnRfbnVtICAgICAgICAgICAgIFVzZXIgRXRoZXJuZXQgcG9ydCBudW1iZXIuCisgKiAgICAgICBwb3J0X3BoeV9hZGRyCQkgICAgVXNlciBQSFkgYWRkcmVzcyBvZiBFdGhlcm5ldCBwb3J0LgorICogICAgICAgcG9ydF9tYWNfYWRkcls2XQkgICAgVXNlciBkZWZpbmVkIHBvcnQgTUFDIGFkZHJlc3MuCisgKiAgICAgICBwb3J0X2NvbmZpZyAgICAgICAgICBVc2VyIHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZS4KKyAqICAgICAgIHBvcnRfY29uZmlnX2V4dGVuZCAgICBVc2VyIHBvcnQgY29uZmlnIGV4dGVuZCB2YWx1ZS4KKyAqICAgICAgIHBvcnRfc2RtYV9jb25maWcgICAgICBVc2VyIHBvcnQgU0RNQSBjb25maWcgdmFsdWUuCisgKiAgICAgICBwb3J0X3NlcmlhbF9jb250cm9sICAgVXNlciBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlLgorICogICAgICAgKnBvcnRfdmlydF90b19waHlzICgpICBVc2VyIGZ1bmN0aW9uIHRvIGNhc3QgdmlydHVhbCBhZGRyIHRvIENQVSBidXMgYWRkci4KKyAqICAgICAgICpwb3J0X3ByaXZhdGUgICAgICAgIFVzZXIgc2NyYXRjaCBwYWQgZm9yIHVzZXIgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmVzLgorICoKKyAqICAgICAgIFRoaXMgZHJpdmVyIGludHJvZHVjZSBhIHNldCBvZiBkZWZhdWx0IHZhbHVlczoKKyAqICAgICAgIFBPUlRfQ09ORklHX1ZBTFVFICAgICAgICAgICBEZWZhdWx0IHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZQorICogICAgICAgUE9SVF9DT05GSUdfRVhURU5EX1ZBTFVFICAgIERlZmF1bHQgcG9ydCBleHRlbmQgY29uZmlndXJhdGlvbiB2YWx1ZQorICogICAgICAgUE9SVF9TRE1BX0NPTkZJR19WQUxVRSAgICAgIERlZmF1bHQgc2RtYSBjb250cm9sIHZhbHVlCisgKiAgICAgICBQT1JUX1NFUklBTF9DT05UUk9MX1ZBTFVFICAgRGVmYXVsdCBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlCisgKgorICoJCVRoaXMgZHJpdmVyIGRhdGEgZmxvdyBpcyBkb25lIHVzaW5nIHRoZSBQS1RfSU5GTyBzdHJ1Y3Qgd2hpY2ggaXMKKyAqCQlhIHVuaWZpZWQgc3RydWN0IGZvciBSeCBhbmQgVHggb3BlcmF0aW9uczoKKyAqCQlieXRlX2NudAlUeC9SeCBkZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50LgorICoJCWw0aV9jaGsJCUNQVSBwcm92aWRlZCBUQ1AgQ2hlY2tzdW0uIEZvciBUeCBvcGVyYXRpb24gb25seS4KKyAqCQljbWRfc3RzCQlUeC9SeCBkZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzLgorICoJCWJ1Zl9wdHIJCVR4L1J4IGRlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIuCisgKgkJcmV0dXJuX2luZm8JVHgvUnggdXNlciByZXNvdXJjZSByZXR1cm4gaW5mb3JtYXRpb24uCisgKgorICoKKyAqCQlFWFRFUk5BTCBTVVBQT1JUIFJFUVVJUkVNRU5UUworICoKKyAqCQlUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsIHN1cHBvcnQ6CisgKgorICoJCURfQ0FDSEVfRkxVU0hfTElORSAoYWRkcmVzcywgYWRkcmVzcyBvZmZzZXQpCisgKgorICoJCVRoaXMgbWFjcm8gYXBwbGllcyBhc3NlbWJseSBjb2RlIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlIGNhY2hlCisgKgkJbGluZS4KKyAqCQlhZGRyZXNzICAgICAgICAtIGFkZHJlc3MgYmFzZS4KKyAqCQlhZGRyZXNzIG9mZnNldCAtIGFkZHJlc3Mgb2Zmc2V0CisgKgorICoKKyAqCQlDUFVfUElQRV9GTFVTSAorICoKKyAqCQlUaGlzIG1hY3JvIGFwcGxpZXMgYXNzZW1ibHkgY29kZSB0byBmbHVzaCB0aGUgQ1BVIHBpcGVsaW5lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW5jbHVkZXMgKi8KKworLyogZGVmaW5lcyAqLworLyogU0RNQSBjb21tYW5kIG1hY3JvcyAqLworI2RlZmluZSBFVEhfRU5BQkxFX1RYX1FVRVVFKHR4X3F1ZXVlLCBldGhfcG9ydCkgXAorIE1WX1JFR19XUklURShNVjY0NDYwX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhldGhfcG9ydCksICgxIDw8IHR4X3F1ZXVlKSkKKworI2RlZmluZSBFVEhfRElTQUJMRV9UWF9RVUVVRSh0eF9xdWV1ZSwgZXRoX3BvcnQpIFwKKyBNVl9SRUdfV1JJVEUoTVY2NDQ2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcoZXRoX3BvcnQpLFwKKyAoMSA8PCAoOCArIHR4X3F1ZXVlKSkpCisKKyNkZWZpbmUgRVRIX0VOQUJMRV9SWF9RVUVVRShyeF9xdWV1ZSwgZXRoX3BvcnQpIFwKK01WX1JFR19XUklURShNVjY0NDYwX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKGV0aF9wb3J0KSwgKDEgPDwgcnhfcXVldWUpKQorCisjZGVmaW5lIEVUSF9ESVNBQkxFX1JYX1FVRVVFKHJ4X3F1ZXVlLCBldGhfcG9ydCkgXAorTVZfUkVHX1dSSVRFKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcoZXRoX3BvcnQpLCAoMSA8PCAoOCArIHJ4X3F1ZXVlKSkpCisKKyNkZWZpbmUgQ1VSUl9SRkRfR0VUKHBfY3Vycl9kZXNjLCBxdWV1ZSkgXAorICgocF9jdXJyX2Rlc2MpID0gcF9ldGhfcG9ydF9jdHJsLT5wX3J4X2N1cnJfZGVzY19xW3F1ZXVlXSkKKworI2RlZmluZSBDVVJSX1JGRF9TRVQocF9jdXJyX2Rlc2MsIHF1ZXVlKSBcCisgKHBfZXRoX3BvcnRfY3RybC0+cF9yeF9jdXJyX2Rlc2NfcVtxdWV1ZV0gPSAocF9jdXJyX2Rlc2MpKQorCisjZGVmaW5lIFVTRURfUkZEX0dFVChwX3VzZWRfZGVzYywgcXVldWUpIFwKKyAoKHBfdXNlZF9kZXNjKSA9IHBfZXRoX3BvcnRfY3RybC0+cF9yeF91c2VkX2Rlc2NfcVtxdWV1ZV0pCisKKyNkZWZpbmUgVVNFRF9SRkRfU0VUKHBfdXNlZF9kZXNjLCBxdWV1ZSlcCisocF9ldGhfcG9ydF9jdHJsLT5wX3J4X3VzZWRfZGVzY19xW3F1ZXVlXSA9IChwX3VzZWRfZGVzYykpCisKKworI2RlZmluZSBDVVJSX1RGRF9HRVQocF9jdXJyX2Rlc2MsIHF1ZXVlKSBcCisgKChwX2N1cnJfZGVzYykgPSBwX2V0aF9wb3J0X2N0cmwtPnBfdHhfY3Vycl9kZXNjX3FbcXVldWVdKQorCisjZGVmaW5lIENVUlJfVEZEX1NFVChwX2N1cnJfZGVzYywgcXVldWUpIFwKKyAocF9ldGhfcG9ydF9jdHJsLT5wX3R4X2N1cnJfZGVzY19xW3F1ZXVlXSA9IChwX2N1cnJfZGVzYykpCisKKyNkZWZpbmUgVVNFRF9URkRfR0VUKHBfdXNlZF9kZXNjLCBxdWV1ZSkgXAorICgocF91c2VkX2Rlc2MpID0gcF9ldGhfcG9ydF9jdHJsLT5wX3R4X3VzZWRfZGVzY19xW3F1ZXVlXSkKKworI2RlZmluZSBVU0VEX1RGRF9TRVQocF91c2VkX2Rlc2MsIHF1ZXVlKSBcCisgKHBfZXRoX3BvcnRfY3RybC0+cF90eF91c2VkX2Rlc2NfcVtxdWV1ZV0gPSAocF91c2VkX2Rlc2MpKQorCisjZGVmaW5lIEZJUlNUX1RGRF9HRVQocF9maXJzdF9kZXNjLCBxdWV1ZSkgXAorICgocF9maXJzdF9kZXNjKSA9IHBfZXRoX3BvcnRfY3RybC0+cF90eF9maXJzdF9kZXNjX3FbcXVldWVdKQorCisjZGVmaW5lIEZJUlNUX1RGRF9TRVQocF9maXJzdF9kZXNjLCBxdWV1ZSkgXAorIChwX2V0aF9wb3J0X2N0cmwtPnBfdHhfZmlyc3RfZGVzY19xW3F1ZXVlXSA9IChwX2ZpcnN0X2Rlc2MpKQorCisKKy8qIE1hY3JvcyB0aGF0IHNhdmUgYWNjZXNzIHRvIGRlc2MgaW4gb3JkZXIgdG8gZmluZCBuZXh0IGRlc2MgcG9pbnRlciAgKi8KKyNkZWZpbmUgUlhfTkVYVF9ERVNDX1BUUihwX3J4X2Rlc2MsIHF1ZXVlKSAoRVRIX1JYX0RFU0MqKSgoKCgodW5zaWduZWQgaW50KXBfcnhfZGVzYyAtICh1bnNpZ25lZCBpbnQpcF9ldGhfcG9ydF9jdHJsLT5wX3J4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSkgKyBSWF9ERVNDX0FMSUdORURfU0laRSkgJSBwX2V0aF9wb3J0X2N0cmwtPnJ4X2Rlc2NfYXJlYV9zaXplW3F1ZXVlXSkgKyAodW5zaWduZWQgaW50KXBfZXRoX3BvcnRfY3RybC0+cF9yeF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0pCisKKyNkZWZpbmUgVFhfTkVYVF9ERVNDX1BUUihwX3R4X2Rlc2MsIHF1ZXVlKSAoRVRIX1RYX0RFU0MqKSgoKCgodW5zaWduZWQgaW50KXBfdHhfZGVzYyAtICh1bnNpZ25lZCBpbnQpcF9ldGhfcG9ydF9jdHJsLT5wX3R4X2Rlc2NfYXJlYV9iYXNlW3F1ZXVlXSkgKyBUWF9ERVNDX0FMSUdORURfU0laRSkgJSBwX2V0aF9wb3J0X2N0cmwtPnR4X2Rlc2NfYXJlYV9zaXplW3F1ZXVlXSkgKyAodW5zaWduZWQgaW50KXBfZXRoX3BvcnRfY3RybC0+cF90eF9kZXNjX2FyZWFfYmFzZVtxdWV1ZV0pCisKKyNkZWZpbmUgTElOS19VUF9USU1FT1VUCQkxMDAwMDAKKyNkZWZpbmUgUEhZX0JVU1lfVElNRU9VVCAgICAxMDAwMDAwMAorCisvKiBsb2NhbHMgKi8KKworLyogUEhZIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9waHlfc2V0IChFVEhfUE9SVCBldGhfcG9ydF9udW0sIGludCBwaHlfYWRkcik7CitzdGF0aWMgaW50IGV0aGVybmV0X3BoeV9nZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSk7CisKKy8qIEV0aGVybmV0IFBvcnQgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGV0aF9zZXRfYWNjZXNzX2NvbnRyb2wgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgICAgRVRIX1dJTl9QQVJBTSAqIHBhcmFtKTsKK3N0YXRpYyBib29sIGV0aF9wb3J0X3VjX2FkZHIgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwgdW5zaWduZWQgY2hhciB1Y19uaWJibGUsCisJCQkgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pOworI2lmIDAJCQkJLyogRklYTUUgKi8KK3N0YXRpYyBib29sIGV0aF9wb3J0X3NtY19hZGRyIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBtY19ieXRlLAorCQkJICAgICAgIEVUSF9RVUVVRSBxdWV1ZSwgaW50IG9wdGlvbik7CitzdGF0aWMgYm9vbCBldGhfcG9ydF9vbWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgY3JjOCwKKwkJCSAgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGV0aF9iX2NvcHkgKHVuc2lnbmVkIGludCBzcmNfYWRkciwgdW5zaWduZWQgaW50IGRzdF9hZGRyLAorCQkJaW50IGJ5dGVfY291bnQpOworCit2b2lkIGV0aF9kYmcgKEVUSF9QT1JUX0lORk8gKiBwX2V0aF9wb3J0X2N0cmwpOworCisKK3R5cGVkZWYgZW51bSBfbWVtb3J5X2JhbmsgeyBCQU5LMCwgQkFOSzEsIEJBTksyLCBCQU5LMyB9IE1FTU9SWV9CQU5LOwordTMyIG12X2dldF9kcmFtX2JhbmtfYmFzZV9hZGRyIChNRU1PUllfQkFOSyBiYW5rKQoreworCXUzMiByZXN1bHQgPSAwOworCXUzMiBlbmFibGUgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9CQVNFX0FERFJfRU5BQkxFKTsKKworCWlmIChlbmFibGUgJiAoMSA8PCBiYW5rKSkKKwkJcmV0dXJuIDA7CisJaWYgKGJhbmsgPT0gQkFOSzApCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0NTXzBfQkFTRV9BRERSKTsKKwlpZiAoYmFuayA9PSBCQU5LMSkKKwkJcmVzdWx0ID0gTVZfUkVHX1JFQUQgKE1WNjQ0NjBfQ1NfMV9CQVNFX0FERFIpOworCWlmIChiYW5rID09IEJBTksyKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9DU18yX0JBU0VfQUREUik7CisJaWYgKGJhbmsgPT0gQkFOSzMpCisJCXJlc3VsdCA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0NTXzNfQkFTRV9BRERSKTsKKwlyZXN1bHQgJj0gMHgwMDAwZmZmZjsKKwlyZXN1bHQgPSByZXN1bHQgPDwgMTY7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordTMyIG12X2dldF9kcmFtX2Jhbmtfc2l6ZSAoTUVNT1JZX0JBTksgYmFuaykKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKwl1MzIgZW5hYmxlID0gTVZfUkVHX1JFQUQgKE1WNjQ0NjBfQkFTRV9BRERSX0VOQUJMRSk7CisKKwlpZiAoZW5hYmxlICYgKDEgPDwgYmFuaykpCisJCXJldHVybiAwOworCWlmIChiYW5rID09IEJBTkswKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9DU18wX1NJWkUpOworCWlmIChiYW5rID09IEJBTksxKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9DU18xX1NJWkUpOworCWlmIChiYW5rID09IEJBTksyKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9DU18yX1NJWkUpOworCWlmIChiYW5rID09IEJBTkszKQorCQlyZXN1bHQgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9DU18zX1NJWkUpOworCXJlc3VsdCArPSAxOworCXJlc3VsdCAmPSAweDAwMDBmZmZmOworCXJlc3VsdCA9IHJlc3VsdCA8PCAxNjsKKwlyZXR1cm4gcmVzdWx0OworfQorCit1MzIgbXZfZ2V0X2ludGVybmFsX3NyYW1fYmFzZSAodm9pZCkKK3sKKwl1MzIgcmVzdWx0OworCisJcmVzdWx0ID0gTVZfUkVHX1JFQUQgKE1WNjQ0NjBfSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUik7CisJcmVzdWx0ICY9IDB4MDAwMGZmZmY7CisJcmVzdWx0ID0gcmVzdWx0IDw8IDE2OworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X2luaXQgLSBJbml0aWFsaXplIHRoZSBFdGhlcm5ldCBwb3J0IGRyaXZlcgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgZXRoZXJuZXQgcG9ydCB0byBzdGFydCBpdHMgYWN0aXZpdHk6CisqICAgICAgIDEpIENvbXBsZXRlcyB0aGUgZXRoZXJuZXQgcG9ydCBkcml2ZXIgc3RydWN0IGluaXRpYWxpemF0aW9uIHRvd2FyZCBwb3J0CisqICAgICAgICAgICBzdGFydCByb3V0aW5lLgorKiAgICAgICAyKSBSZXNldHMgdGhlIGRldmljZSB0byBhIHF1aWVzY2VudCBzdGF0ZSBpbiBjYXNlIG9mIHdhcm0gcmVib290LgorKiAgICAgICAzKSBFbmFibGUgU0RNQSBhY2Nlc3MgdG8gYWxsIGZvdXIgRFJBTSBiYW5rcyBhcyB3ZWxsIGFzIGludGVybmFsIFNSQU0uCisqICAgICAgIDQpIENsZWFuIE1BQyB0YWJsZXMuIFRoZSByZXNldCBzdGF0dXMgb2YgdGhvc2UgdGFibGVzIGlzIHVua25vd24uCisqICAgICAgIDUpIFNldCBQSFkgYWRkcmVzcy4KKyogICAgICAgTm90ZTogQ2FsbCB0aGlzIHJvdXRpbmUgcHJpb3IgdG8gZXRoX3BvcnRfc3RhcnQgcm91dGluZSBhbmQgYWZ0ZXIgc2V0dGluZworKiAgICAgICB1c2VyIHZhbHVlcyBpbiB0aGUgdXNlciBmaWVsZHMgb2YgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdCAoaS5lLgorKiAgICAgICBwb3J0X3BoeV9hZGRyKS4KKyoKKyogSU5QVVQ6CisqICAgICAgIEVUSF9QT1JUX0lORk8gCSpwX2V0aF9wb3J0X2N0cmwgICAgICAgRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdAorKgorKiBPVVRQVVQ6CisqICAgICAgIFNlZSBkZXNjcmlwdGlvbi4KKyoKKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X2luaXQgKEVUSF9QT1JUX0lORk8gKiBwX2V0aF9wb3J0X2N0cmwpCit7CisJaW50IHF1ZXVlOworCUVUSF9XSU5fUEFSQU0gd2luX3BhcmFtOworCisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X2NvbmZpZyA9IFBPUlRfQ09ORklHX1ZBTFVFOworCXBfZXRoX3BvcnRfY3RybC0+cG9ydF9jb25maWdfZXh0ZW5kID0gUE9SVF9DT05GSUdfRVhURU5EX1ZBTFVFOworCXBfZXRoX3BvcnRfY3RybC0+cG9ydF9zZG1hX2NvbmZpZyA9IFBPUlRfU0RNQV9DT05GSUdfVkFMVUU7CisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3NlcmlhbF9jb250cm9sID0gUE9SVF9TRVJJQUxfQ09OVFJPTF9WQUxVRTsKKworCXBfZXRoX3BvcnRfY3RybC0+cG9ydF9yeF9xdWV1ZV9jb21tYW5kID0gMDsKKwlwX2V0aF9wb3J0X2N0cmwtPnBvcnRfdHhfcXVldWVfY29tbWFuZCA9IDA7CisKKwkvKiBaZXJvIG91dCBTVyBzdHJ1Y3RzICovCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTUFYX1JYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQlDVVJSX1JGRF9TRVQgKChFVEhfUlhfREVTQyAqKSAweDAwMDAwMDAwLCBxdWV1ZSk7CisJCVVTRURfUkZEX1NFVCAoKEVUSF9SWF9ERVNDICopIDB4MDAwMDAwMDAsIHF1ZXVlKTsKKwkJcF9ldGhfcG9ydF9jdHJsLT5yeF9yZXNvdXJjZV9lcnJbcXVldWVdID0gZmFsc2U7CisJfQorCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTUFYX1RYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQlDVVJSX1RGRF9TRVQgKChFVEhfVFhfREVTQyAqKSAweDAwMDAwMDAwLCBxdWV1ZSk7CisJCVVTRURfVEZEX1NFVCAoKEVUSF9UWF9ERVNDICopIDB4MDAwMDAwMDAsIHF1ZXVlKTsKKwkJRklSU1RfVEZEX1NFVCAoKEVUSF9UWF9ERVNDICopIDB4MDAwMDAwMDAsIHF1ZXVlKTsKKwkJcF9ldGhfcG9ydF9jdHJsLT50eF9yZXNvdXJjZV9lcnJbcXVldWVdID0gZmFsc2U7CisJfQorCisJZXRoX3BvcnRfcmVzZXQgKHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0pOworCisJLyogU2V0IGFjY2VzcyBwYXJhbWV0ZXJzIGZvciBEUkFNIGJhbmsgMCAqLworCXdpbl9wYXJhbS53aW4gPSBFVEhfV0lOMDsJLyogVXNlIEV0aGVybmV0IHdpbmRvdyAwICovCisJd2luX3BhcmFtLnRhcmdldCA9IEVUSF9UQVJHRVRfRFJBTTsJLyogV2luZG93IHRhcmdldCAtIEREUiAgKi8KKwl3aW5fcGFyYW0uYXR0cmlidXRlcyA9IEVCQVJfQVRUUl9EUkFNX0NTMDsJLyogRW5hYmxlIERSQU0gYmFuayAgICovCisjaWZuZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKwl3aW5fcGFyYW0uYXR0cmlidXRlcyB8PSBFQkFSX0FUVFJfRFJBTV9DQUNIRV9DT0hFUkVOQ1lfV0I7CisjZW5kaWYKKwl3aW5fcGFyYW0uaGlnaF9hZGRyID0gMDsKKwkvKiBHZXQgYmFuayBiYXNlICovCisJd2luX3BhcmFtLmJhc2VfYWRkciA9IG12X2dldF9kcmFtX2JhbmtfYmFzZV9hZGRyIChCQU5LMCk7CisJd2luX3BhcmFtLnNpemUgPSBtdl9nZXRfZHJhbV9iYW5rX3NpemUgKEJBTkswKTsJLyogR2V0IGJhbmsgc2l6ZSAqLworCWlmICh3aW5fcGFyYW0uc2l6ZSA9PSAwKQorCQl3aW5fcGFyYW0uZW5hYmxlID0gMDsKKwllbHNlCisJCXdpbl9wYXJhbS5lbmFibGUgPSAxOwkvKiBFbmFibGUgdGhlIGFjY2VzcyAqLworCXdpbl9wYXJhbS5hY2Nlc3NfY3RybCA9IEVXSU5fQUNDRVNTX0ZVTEw7CS8qIEVuYWJsZSBmdWxsIGFjY2VzcyAqLworCisJLyogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBmb3IgYWRkcmVzcyB3aW5kb3cgKEVQQVBSKSBSRUFEICYgV1JJVEUgKi8KKwlldGhfc2V0X2FjY2Vzc19jb250cm9sIChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLCAmd2luX3BhcmFtKTsKKworCS8qIFNldCBhY2Nlc3MgcGFyYW1ldGVycyBmb3IgRFJBTSBiYW5rIDEgKi8KKwl3aW5fcGFyYW0ud2luID0gRVRIX1dJTjE7CS8qIFVzZSBFdGhlcm5ldCB3aW5kb3cgMSAqLworCXdpbl9wYXJhbS50YXJnZXQgPSBFVEhfVEFSR0VUX0RSQU07CS8qIFdpbmRvdyB0YXJnZXQgLSBERFIgKi8KKwl3aW5fcGFyYW0uYXR0cmlidXRlcyA9IEVCQVJfQVRUUl9EUkFNX0NTMTsJLyogRW5hYmxlIERSQU0gYmFuayAqLworI2lmbmRlZiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFCisJd2luX3BhcmFtLmF0dHJpYnV0ZXMgfD0gRUJBUl9BVFRSX0RSQU1fQ0FDSEVfQ09IRVJFTkNZX1dCOworI2VuZGlmCisJd2luX3BhcmFtLmhpZ2hfYWRkciA9IDA7CisJLyogR2V0IGJhbmsgYmFzZSAqLworCXdpbl9wYXJhbS5iYXNlX2FkZHIgPSBtdl9nZXRfZHJhbV9iYW5rX2Jhc2VfYWRkciAoQkFOSzEpOworCXdpbl9wYXJhbS5zaXplID0gbXZfZ2V0X2RyYW1fYmFua19zaXplIChCQU5LMSk7CS8qIEdldCBiYW5rIHNpemUgKi8KKwlpZiAod2luX3BhcmFtLnNpemUgPT0gMCkKKwkJd2luX3BhcmFtLmVuYWJsZSA9IDA7CisJZWxzZQorCQl3aW5fcGFyYW0uZW5hYmxlID0gMTsJLyogRW5hYmxlIHRoZSBhY2Nlc3MgKi8KKwl3aW5fcGFyYW0uYWNjZXNzX2N0cmwgPSBFV0lOX0FDQ0VTU19GVUxMOwkvKiBFbmFibGUgZnVsbCBhY2Nlc3MgKi8KKworCS8qIFNldCB0aGUgYWNjZXNzIGNvbnRyb2wgZm9yIGFkZHJlc3Mgd2luZG93IChFUEFQUikgUkVBRCAmIFdSSVRFICovCisJZXRoX3NldF9hY2Nlc3NfY29udHJvbCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSwgJndpbl9wYXJhbSk7CisKKwkvKiBTZXQgYWNjZXNzIHBhcmFtZXRlcnMgZm9yIERSQU0gYmFuayAyICovCisJd2luX3BhcmFtLndpbiA9IEVUSF9XSU4yOwkvKiBVc2UgRXRoZXJuZXQgd2luZG93IDIgKi8KKwl3aW5fcGFyYW0udGFyZ2V0ID0gRVRIX1RBUkdFVF9EUkFNOwkvKiBXaW5kb3cgdGFyZ2V0IC0gRERSICovCisJd2luX3BhcmFtLmF0dHJpYnV0ZXMgPSBFQkFSX0FUVFJfRFJBTV9DUzI7CS8qIEVuYWJsZSBEUkFNIGJhbmsgKi8KKyNpZm5kZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorCXdpbl9wYXJhbS5hdHRyaWJ1dGVzIHw9IEVCQVJfQVRUUl9EUkFNX0NBQ0hFX0NPSEVSRU5DWV9XQjsKKyNlbmRpZgorCXdpbl9wYXJhbS5oaWdoX2FkZHIgPSAwOworCS8qIEdldCBiYW5rIGJhc2UgKi8KKwl3aW5fcGFyYW0uYmFzZV9hZGRyID0gbXZfZ2V0X2RyYW1fYmFua19iYXNlX2FkZHIgKEJBTksyKTsKKwl3aW5fcGFyYW0uc2l6ZSA9IG12X2dldF9kcmFtX2Jhbmtfc2l6ZSAoQkFOSzIpOwkvKiBHZXQgYmFuayBzaXplICovCisJaWYgKHdpbl9wYXJhbS5zaXplID09IDApCisJCXdpbl9wYXJhbS5lbmFibGUgPSAwOworCWVsc2UKKwkJd2luX3BhcmFtLmVuYWJsZSA9IDE7CS8qIEVuYWJsZSB0aGUgYWNjZXNzICovCisJd2luX3BhcmFtLmFjY2Vzc19jdHJsID0gRVdJTl9BQ0NFU1NfRlVMTDsJLyogRW5hYmxlIGZ1bGwgYWNjZXNzICovCisKKwkvKiBTZXQgdGhlIGFjY2VzcyBjb250cm9sIGZvciBhZGRyZXNzIHdpbmRvdyAoRVBBUFIpIFJFQUQgJiBXUklURSAqLworCWV0aF9zZXRfYWNjZXNzX2NvbnRyb2wgKHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0sICZ3aW5fcGFyYW0pOworCisJLyogU2V0IGFjY2VzcyBwYXJhbWV0ZXJzIGZvciBEUkFNIGJhbmsgMyAqLworCXdpbl9wYXJhbS53aW4gPSBFVEhfV0lOMzsJLyogVXNlIEV0aGVybmV0IHdpbmRvdyAzICovCisJd2luX3BhcmFtLnRhcmdldCA9IEVUSF9UQVJHRVRfRFJBTTsJLyogV2luZG93IHRhcmdldCAtIEREUiAqLworCXdpbl9wYXJhbS5hdHRyaWJ1dGVzID0gRUJBUl9BVFRSX0RSQU1fQ1MzOwkvKiBFbmFibGUgRFJBTSBiYW5rICovCisjaWZuZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKwl3aW5fcGFyYW0uYXR0cmlidXRlcyB8PSBFQkFSX0FUVFJfRFJBTV9DQUNIRV9DT0hFUkVOQ1lfV0I7CisjZW5kaWYKKwl3aW5fcGFyYW0uaGlnaF9hZGRyID0gMDsKKwkvKiBHZXQgYmFuayBiYXNlICovCisJd2luX3BhcmFtLmJhc2VfYWRkciA9IG12X2dldF9kcmFtX2JhbmtfYmFzZV9hZGRyIChCQU5LMyk7CisJd2luX3BhcmFtLnNpemUgPSBtdl9nZXRfZHJhbV9iYW5rX3NpemUgKEJBTkszKTsJLyogR2V0IGJhbmsgc2l6ZSAqLworCWlmICh3aW5fcGFyYW0uc2l6ZSA9PSAwKQorCQl3aW5fcGFyYW0uZW5hYmxlID0gMDsKKwllbHNlCisJCXdpbl9wYXJhbS5lbmFibGUgPSAxOwkvKiBFbmFibGUgdGhlIGFjY2VzcyAqLworCXdpbl9wYXJhbS5hY2Nlc3NfY3RybCA9IEVXSU5fQUNDRVNTX0ZVTEw7CS8qIEVuYWJsZSBmdWxsIGFjY2VzcyAqLworCisJLyogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBmb3IgYWRkcmVzcyB3aW5kb3cgKEVQQVBSKSBSRUFEICYgV1JJVEUgKi8KKwlldGhfc2V0X2FjY2Vzc19jb250cm9sIChwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtLCAmd2luX3BhcmFtKTsKKworCS8qIFNldCBhY2Nlc3MgcGFyYW1ldGVycyBmb3IgSW50ZXJuYWwgU1JBTSAqLworCXdpbl9wYXJhbS53aW4gPSBFVEhfV0lONDsJLyogVXNlIEV0aGVybmV0IHdpbmRvdyAwICovCisJd2luX3BhcmFtLnRhcmdldCA9IEVCQVJfVEFSR0VUX0NCUzsJLyogVGFyZ2V0IC0gSW50ZXJuYWwgU1JBTSAqLworCXdpbl9wYXJhbS5hdHRyaWJ1dGVzID0gRUJBUl9BVFRSX0NCU19TUkFNIHwgRUJBUl9BVFRSX0NCU19TUkFNX0JMT0NLMDsKKwl3aW5fcGFyYW0uaGlnaF9hZGRyID0gMDsKKwl3aW5fcGFyYW0uYmFzZV9hZGRyID0gbXZfZ2V0X2ludGVybmFsX3NyYW1fYmFzZSAoKTsJLyogR2V0IGJhc2UgYWRkciAqLworCXdpbl9wYXJhbS5zaXplID0gTVY2NDQ2MF9JTlRFUk5BTF9TUkFNX1NJWkU7CS8qIEdldCBiYW5rIHNpemUgKi8KKwl3aW5fcGFyYW0uZW5hYmxlID0gMTsJLyogRW5hYmxlIHRoZSBhY2Nlc3MgKi8KKwl3aW5fcGFyYW0uYWNjZXNzX2N0cmwgPSBFV0lOX0FDQ0VTU19GVUxMOwkvKiBFbmFibGUgZnVsbCBhY2Nlc3MgKi8KKworCS8qIFNldCB0aGUgYWNjZXNzIGNvbnRyb2wgZm9yIGFkZHJlc3Mgd2luZG93IChFUEFQUikgUkVBRCAmIFdSSVRFICovCisJZXRoX3NldF9hY2Nlc3NfY29udHJvbCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSwgJndpbl9wYXJhbSk7CisKKwlldGhfcG9ydF9pbml0X21hY190YWJsZXMgKHBfZXRoX3BvcnRfY3RybC0+cG9ydF9udW0pOworCisJZXRoZXJuZXRfcGh5X3NldCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSwKKwkJCSAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3BoeV9hZGRyKTsKKworCXJldHVybjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfcG9ydF9zdGFydCAtIFN0YXJ0IHRoZSBFdGhlcm5ldCBwb3J0IGFjdGl2aXR5LgorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHByZXBhcmVzIHRoZSBFdGhlcm5ldCBwb3J0IGZvciBSeCBhbmQgVHggYWN0aXZpdHk6CisqICAgICAgIDEuIEluaXRpYWxpemUgVHggYW5kIFJ4IEN1cnJlbnQgRGVzY3JpcHRvciBQb2ludGVyIGZvciBlYWNoIHF1ZXVlIHRoYXQKKyogICAgICAgICAgIGhhcyBiZWVuIGluaXRpYWxpemVkIGEgZGVzY3JpcHRvcidzIHJpbmcgKHVzaW5nIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nCisqICAgICAgICAgICBmb3IgVHggYW5kIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nIGZvciBSeCkKKyogICAgICAgMi4gSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZSBFdGhlcm5ldCBjb25maWd1cmF0aW9uIHBvcnQgYnkgd3JpdGluZyB0bworKiAgICAgICAgICAgdGhlIHBvcnQncyBjb25maWd1cmF0aW9uIGFuZCBjb21tYW5kIHJlZ2lzdGVycy4KKyogICAgICAgMy4gSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZSBTRE1BIGJ5IHdyaXRpbmcgdG8gdGhlIFNETUEncworKiAgICBjb25maWd1cmF0aW9uIGFuZCBjb21tYW5kIHJlZ2lzdGVycy4KKyogICAgICAgQWZ0ZXIgY29tcGxldGluZyB0aGVzZSBzdGVwcywgdGhlIGV0aGVybmV0IHBvcnQgU0RNQSBjYW4gc3RhcnRzIHRvCisqICAgICAgIHBlcmZvcm0gUnggYW5kIFR4IGFjdGl2aXRpZXMuCisqCisqICAgICAgIE5vdGU6IEVhY2ggUnggYW5kIFR4IHF1ZXVlIGRlc2NyaXB0b3IncyBsaXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQgcHJpb3IKKyogICAgICAgdG8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uICh1c2UgZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcgZm9yIFR4IHF1ZXVlcyBhbmQKKyogICAgICAgZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgZm9yIFJ4IHF1ZXVlcykuCisqCisqIElOUFVUOgorKiAgICAgICBFVEhfUE9SVF9JTkZPIAkqcF9ldGhfcG9ydF9jdHJsICAgICAgIEV0aGVybmV0IHBvcnQgY29udHJvbCBzdHJ1Y3QKKyoKKyogT1VUUFVUOgorKiAgICAgICBFdGhlcm5ldCBwb3J0IGlzIHJlYWR5IHRvIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorKgorKiBSRVRVUk46CisqICAgICAgIGZhbHNlIGlmIHRoZSBwb3J0IFBIWSBpcyBub3QgdXAuCisqICAgICAgIHRydWUgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIGV0aF9wb3J0X3N0YXJ0IChFVEhfUE9SVF9JTkZPICogcF9ldGhfcG9ydF9jdHJsKQoreworCWludCBxdWV1ZTsKKwl2b2xhdGlsZSBFVEhfVFhfREVTQyAqcF90eF9jdXJyX2Rlc2M7CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfY3Vycl9kZXNjOworCXVuc2lnbmVkIGludCBwaHlfcmVnX2RhdGE7CisJRVRIX1BPUlQgZXRoX3BvcnRfbnVtID0gcF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bTsKKworCisJLyogQXNzaWdubWVudCBvZiBUeCBDVFJQIG9mIGdpdmVuIHF1ZXVlICovCisJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgTUFYX1RYX1FVRVVFX05VTTsgcXVldWUrKykgeworCQlDVVJSX1RGRF9HRVQgKHBfdHhfY3Vycl9kZXNjLCBxdWV1ZSk7CisJCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMAorCQkJICAgICAgIChldGhfcG9ydF9udW0pCisJCQkgICAgICAgKyAoNCAqIHF1ZXVlKSksCisJCQkgICAgICAoKHVuc2lnbmVkIGludCkgcF90eF9jdXJyX2Rlc2MpKTsKKworCX0KKworCS8qIEFzc2lnbm1lbnQgb2YgUnggQ1JEUCBvZiBnaXZlbiBxdWV1ZSAqLworCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IE1BWF9SWF9RVUVVRV9OVU07IHF1ZXVlKyspIHsKKwkJQ1VSUl9SRkRfR0VUIChwX3J4X2N1cnJfZGVzYywgcXVldWUpOworCQlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAKKwkJCSAgICAgICAoZXRoX3BvcnRfbnVtKQorCQkJICAgICAgICsgKDQgKiBxdWV1ZSkpLAorCQkJICAgICAgKCh1bnNpZ25lZCBpbnQpIHBfcnhfY3Vycl9kZXNjKSk7CisKKwkJaWYgKHBfcnhfY3Vycl9kZXNjICE9IE5VTEwpCisJCQkvKiBBZGQgdGhlIGFzc2lnbmVkIEV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIHBvcnQncyBhZGRyZXNzIHRhYmxlICovCisJCQlldGhfcG9ydF91Y19hZGRyX3NldCAocF9ldGhfcG9ydF9jdHJsLT5wb3J0X251bSwKKwkJCQkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X21hY19hZGRyLAorCQkJCQkgICAgICBxdWV1ZSk7CisJfQorCisJLyogQXNzaWduIHBvcnQgY29uZmlndXJhdGlvbiBhbmQgY29tbWFuZC4gKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1BPUlRfQ09ORklHX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X2NvbmZpZyk7CisKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIHBfZXRoX3BvcnRfY3RybC0+cG9ydF9jb25maWdfZXh0ZW5kKTsKKworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIHBfZXRoX3BvcnRfY3RybC0+cG9ydF9zZXJpYWxfY29udHJvbCk7CisKKwlNVl9TRVRfUkVHX0JJVFMgKE1WNjQ0NjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHIChldGhfcG9ydF9udW0pLAorCQkJIEVUSF9TRVJJQUxfUE9SVF9FTkFCTEUpOworCisJLyogQXNzaWduIHBvcnQgU0RNQSBjb25maWd1cmF0aW9uICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9TRE1BX0NPTkZJR19SRUcgKGV0aF9wb3J0X251bSksCisJCSAgICAgIHBfZXRoX3BvcnRfY3RybC0+cG9ydF9zZG1hX2NvbmZpZyk7CisKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzBfVE9LRU5fQlVDS0VUX0NPVU5UCisJCSAgICAgIChldGhfcG9ydF9udW0pLCAweDNmZmZmZmZmKTsKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzBfVE9LRU5fQlVDS0VUX0NPTkZJRworCQkgICAgICAoZXRoX3BvcnRfbnVtKSwgMHgwM2ZmZmNmZik7CisJLyogVHVybiBvZmYgdGhlIHBvcnQvcXVldWUgYmFuZHdpZHRoIGxpbWl0YXRpb24gKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX01BWElNVU1fVFJBTlNNSVRfVU5JVCAoZXRoX3BvcnRfbnVtKSwgMHgwKTsKKworCS8qIEVuYWJsZSBwb3J0IFJ4LiAqLworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQpOworCisJLyogQ2hlY2sgaWYgbGluayBpcyB1cCAqLworCWV0aF9wb3J0X3JlYWRfc21pX3JlZyAoZXRoX3BvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhKTsKKworCWlmICghKHBoeV9yZWdfZGF0YSAmIDB4MjApKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3BvcnRfdWNfYWRkcl9zZXQgLSBUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCBVbmljYXN0IGFkZHJlc3MuCisqCisqIERFU0NSSVBUSU9OOgorKgkJVGhpcyBmdW5jdGlvbiBTZXQgdGhlIHBvcnQgRXRoZXJuZXQgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUOgorKglFVEhfUE9SVCBldGhfcG9ydF9udW0gICAgIFBvcnQgbnVtYmVyLgorKgljaGFyICogICAgICAgIHBfYWRkcgkJQWRkcmVzcyB0byBiZSBzZXQKKyoJRVRIX1FVRVVFIAkgIHF1ZXVlCQlSeCBxdWV1ZSBudW1iZXIgZm9yIHRoaXMgTUFDIGFkZHJlc3MuCisqCisqIE9VVFBVVDoKKyoJU2V0IE1BQyBhZGRyZXNzIGxvdyBhbmQgaGlnaCByZWdpc3RlcnMuIGFsc28gY2FsbHMgZXRoX3BvcnRfdWNfYWRkcigpCisqICAgICAgIFRvIHNldCB0aGUgdW5pY2FzdCB0YWJsZSB3aXRoIHRoZSBwcm9wZXIgaW5mb3JtYXRpb24uCisqCisqIFJFVFVSTjoKKyoJTi9BLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfc2V0IChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICB1bnNpZ25lZCBjaGFyICpwX2FkZHIsIEVUSF9RVUVVRSBxdWV1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFjX2g7CisJdW5zaWduZWQgaW50IG1hY19sOworCisJbWFjX2wgPSAocF9hZGRyWzRdIDw8IDgpIHwgKHBfYWRkcls1XSk7CisJbWFjX2ggPSAocF9hZGRyWzBdIDw8IDI0KSB8IChwX2FkZHJbMV0gPDwgMTYpIHwKKwkJKHBfYWRkclsyXSA8PCA4KSB8IChwX2FkZHJbM10gPDwgMCk7CisKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX01BQ19BRERSX0xPVyAoZXRoX3BvcnRfbnVtKSwgbWFjX2wpOworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfTUFDX0FERFJfSElHSCAoZXRoX3BvcnRfbnVtKSwgbWFjX2gpOworCisJLyogQWNjZXB0IGZyYW1lcyBvZiB0aGlzIGFkZHJlc3MgKi8KKwlldGhfcG9ydF91Y19hZGRyIChldGhfcG9ydF9udW0sIHBfYWRkcls1XSwgcXVldWUsIEFDQ0VQVF9NQUNfQUREUik7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X3VjX2FkZHIgLSBUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCB1bmljYXN0IGFkZHJlc3MgdGFibGUKKyoKKyogREVTQ1JJUFRJT046CisqCVRoaXMgZnVuY3Rpb24gbG9jYXRlcyB0aGUgcHJvcGVyIGVudHJ5IGluIHRoZSBVbmljYXN0IHRhYmxlIGZvciB0aGUKKyoJc3BlY2lmaWVkIE1BQyBuaWJibGUgYW5kIHNldHMgaXRzIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIGZ1bmN0aW9uCisqCXBhcmFtZXRlcnMuCisqCisqIElOUFVUOgorKglFVEhfUE9SVCAJZXRoX3BvcnRfbnVtICAgICAgUG9ydCBudW1iZXIuCisqCXVuc2lnbmVkIGNoYXIgdWNfbmliYmxlCQlVbmljYXN0IE1BQyBBZGRyZXNzIGxhc3QgbmliYmxlLgorKglFVEhfUVVFVUUgCQkgcXVldWUJCVJ4IHF1ZXVlIG51bWJlciBmb3IgdGhpcyBNQUMgYWRkcmVzcy4KKyoJaW50IAkJCW9wdGlvbiAgICAgIDAgPSBBZGQsIDEgPSByZW1vdmUgYWRkcmVzcy4KKyoKKyogT1VUUFVUOgorKglUaGlzIGZ1bmN0aW9uIGFkZC9yZW1vdmVzIE1BQyBhZGRyZXNzZXMgZnJvbSB0aGUgcG9ydCB1bmljYXN0IGFkZHJlc3MKKyoJdGFibGUuCisqCisqIFJFVFVSTjoKKyoJdHJ1ZSBpcyBvdXRwdXQgc3VjY2VlZGVkLgorKglmYWxzZSBpZiBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfdWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJICAgICAgdW5zaWduZWQgY2hhciB1Y19uaWJibGUsCisJCQkgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IHVuaWNhc3RfcmVnOworCXVuc2lnbmVkIGludCB0Ymxfb2Zmc2V0OworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OworCisJLyogTG9jYXRlIHRoZSBVbmljYXN0IHRhYmxlIGVudHJ5ICovCisJdWNfbmliYmxlID0gKDB4ZiAmIHVjX25pYmJsZSk7CisJdGJsX29mZnNldCA9ICh1Y19uaWJibGUgLyA0KSAqIDQ7CS8qIFJlZ2lzdGVyIG9mZnNldCBmcm9tIHVuaWNhc3QgdGFibGUgYmFzZSAqLworCXJlZ19vZmZzZXQgPSB1Y19uaWJibGUgJSA0OwkvKiBFbnRyeSBvZmZzZXQgd2l0aGluIHRoZSBhYm92ZSByZWdpc3RlciAqLworCisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlIFJFSkVDVF9NQUNfQUREUjoKKwkJLyogQ2xlYXIgYWNjZXB0cyBmcmFtZSBiaXQgYXQgc3BlY2lmaWVkIHVuaWNhc3QgREEgdGFibGUgZW50cnkgKi8KKwkJdW5pY2FzdF9yZWcgPQorCQkJTVZfUkVHX1JFQUQgKChNVjY0NDYwX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkJICAgICAgKGV0aF9wb3J0X251bSkKKwkJCQkgICAgICArIHRibF9vZmZzZXQpKTsKKworCQl1bmljYXN0X3JlZyAmPSAoMHgwRSA8PCAoOCAqIHJlZ19vZmZzZXQpKTsKKworCQlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkgICAgICAgKGV0aF9wb3J0X251bSkKKwkJCSAgICAgICArIHRibF9vZmZzZXQpLCB1bmljYXN0X3JlZyk7CisJCWJyZWFrOworCisJY2FzZSBBQ0NFUFRfTUFDX0FERFI6CisJCS8qIFNldCBhY2NlcHRzIGZyYW1lIGJpdCBhdCB1bmljYXN0IERBIGZpbHRlciB0YWJsZSBlbnRyeSAqLworCQl1bmljYXN0X3JlZyA9CisJCQlNVl9SRUdfUkVBRCAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCQkgICAgICAoZXRoX3BvcnRfbnVtKQorCQkJCSAgICAgICsgdGJsX29mZnNldCkpOworCisJCXVuaWNhc3RfcmVnIHw9ICgoMHgwMSB8IHF1ZXVlKSA8PCAoOCAqIHJlZ19vZmZzZXQpKTsKKworCQlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkgICAgICAgKGV0aF9wb3J0X251bSkKKwkJCSAgICAgICArIHRibF9vZmZzZXQpLCB1bmljYXN0X3JlZyk7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisjaWYgMAkJCQkvKiBGSVhNRSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoX3BvcnRfbWNfYWRkciAtIE11bHRpY2FzdCBhZGRyZXNzIHNldHRpbmdzLgorKgorKiBERVNDUklQVElPTjoKKyoJVGhpcyBBUEkgY29udHJvbHMgdGhlIE1WIGRldmljZSBNQUMgbXVsdGljYXN0IHN1cHBvcnQuCisqCVRoZSBNViBkZXZpY2Ugc3VwcG9ydHMgbXVsdGljYXN0IHVzaW5nIHR3byB0YWJsZXM6CisqCTEpIFNwZWNpYWwgTXVsdGljYXN0IFRhYmxlIGZvciBNQUMgYWRkcmVzc2VzIG9mIHRoZSBmb3JtCisqCSAgIDB4MDEtMDAtNUUtMDAtMDAtWFggKHdoZXJlIFhYIGlzIGJldHdlZW4gMHgwMCBhbmQgMHhfZkYpLgorKgkgICBUaGUgTUFDIERBWzc6MF0gYml0cyBhcmUgdXNlZCBhcyBhIHBvaW50ZXIgdG8gdGhlIFNwZWNpYWwgTXVsdGljYXN0CisqCSAgIFRhYmxlIGVudHJpZXMgaW4gdGhlIERBLUZpbHRlciB0YWJsZS4KKyoJICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb24gY2FsbHMgZXRoX3BvcnRfc21jX2FkZHIoKSByb3V0aW5lIHRvIHNldCB0aGUKKyoJICAgU3BlY2lhbCBNdWx0aWNhc3QgVGFibGUuCisqCTIpIE90aGVyIE11bHRpY2FzdCBUYWJsZSBmb3IgbXVsdGljYXN0IG9mIGFub3RoZXIgdHlwZS4gQSBDUkMtOGJpdAorKgkgICBpcyB1c2VkIGFzIGFuIGluZGV4IHRvIHRoZSBPdGhlciBNdWx0aWNhc3QgVGFibGUgZW50cmllcyBpbiB0aGUKKyoJICAgREEtRmlsdGVyIHRhYmxlLgorKgkgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBDUkMtOGJpdCB2YWx1ZSBhbmQgY2FsbHMKKyoJICAgZXRoX3BvcnRfb21jX2FkZHIoKSByb3V0aW5lIHRvIHNldCB0aGUgT3RoZXIgTXVsdGljYXN0IFRhYmxlLgorKiBJTlBVVDoKKyoJRVRIX1BPUlQgCWV0aF9wb3J0X251bSAgICAgIFBvcnQgbnVtYmVyLgorKgl1bnNpZ25lZCBjaGFyIAkqcF9hZGRyCQlVbmljYXN0IE1BQyBBZGRyZXNzLgorKglFVEhfUVVFVUUgCQkgcXVldWUJCVJ4IHF1ZXVlIG51bWJlciBmb3IgdGhpcyBNQUMgYWRkcmVzcy4KKyoJaW50IAkJCW9wdGlvbiAgICAgIDAgPSBBZGQsIDEgPSByZW1vdmUgYWRkcmVzcy4KKyoKKyogT1VUUFVUOgorKglTZWUgZGVzY3JpcHRpb24uCisqCisqIFJFVFVSTjoKKyoJdHJ1ZSBpcyBvdXRwdXQgc3VjY2VlZGVkLgorKglmYWxzZSBpZiBhZGRfYWRkcmVzc190YWJsZV9lbnRyeSggKSBmYWlsZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfbWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqcF9hZGRyLAorCQkJICAgICAgRVRIX1FVRVVFIHF1ZXVlLCBpbnQgb3B0aW9uKQoreworCXVuc2lnbmVkIGludCBtYWNfaDsKKwl1bnNpZ25lZCBpbnQgbWFjX2w7CisJdW5zaWduZWQgY2hhciBjcmNfcmVzdWx0ID0gMDsKKwlpbnQgbWFjX2FycmF5WzQ4XTsKKwlpbnQgY3JjWzhdOworCWludCBpOworCisKKwlpZiAoKHBfYWRkclswXSA9PSAweDAxKSAmJgorCSAgICAocF9hZGRyWzFdID09IDB4MDApICYmCisJICAgIChwX2FkZHJbMl0gPT0gMHg1RSkgJiYgKHBfYWRkclszXSA9PSAweDAwKSAmJiAocF9hZGRyWzRdID09IDB4MDApKQorCisJCWV0aF9wb3J0X3NtY19hZGRyIChldGhfcG9ydF9udW0sIHBfYWRkcls1XSwgcXVldWUsIG9wdGlvbik7CisJZWxzZSB7CisJCS8qIENhbGN1bGF0ZSBDUkMtOCBvdXQgb2YgdGhlIGdpdmVuIGFkZHJlc3MgKi8KKwkJbWFjX2ggPSAocF9hZGRyWzBdIDw8IDgpIHwgKHBfYWRkclsxXSk7CisJCW1hY19sID0gKHBfYWRkclsyXSA8PCAyNCkgfCAocF9hZGRyWzNdIDw8IDE2KSB8CisJCQkocF9hZGRyWzRdIDw8IDgpIHwgKHBfYWRkcls1XSA8PCAwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCW1hY19hcnJheVtpXSA9IChtYWNfbCA+PiBpKSAmIDB4MTsKKwkJZm9yIChpID0gMzI7IGkgPCA0ODsgaSsrKQorCQkJbWFjX2FycmF5W2ldID0gKG1hY19oID4+IChpIC0gMzIpKSAmIDB4MTsKKworCisJCWNyY1swXSA9IG1hY19hcnJheVs0NV0gXiBtYWNfYXJyYXlbNDNdIF4gbWFjX2FycmF5WzQwXSBeCisJCQltYWNfYXJyYXlbMzldIF4gbWFjX2FycmF5WzM1XSBeIG1hY19hcnJheVszNF0gXgorCQkJbWFjX2FycmF5WzMxXSBeIG1hY19hcnJheVszMF0gXiBtYWNfYXJyYXlbMjhdIF4KKwkJCW1hY19hcnJheVsyM10gXiBtYWNfYXJyYXlbMjFdIF4gbWFjX2FycmF5WzE5XSBeCisJCQltYWNfYXJyYXlbMThdIF4gbWFjX2FycmF5WzE2XSBeIG1hY19hcnJheVsxNF0gXgorCQkJbWFjX2FycmF5WzEyXSBeIG1hY19hcnJheVs4XSBeIG1hY19hcnJheVs3XSBeCisJCQltYWNfYXJyYXlbNl0gXiBtYWNfYXJyYXlbMF07CisKKwkJY3JjWzFdID0gbWFjX2FycmF5WzQ2XSBeIG1hY19hcnJheVs0NV0gXiBtYWNfYXJyYXlbNDRdIF4KKwkJCW1hY19hcnJheVs0M10gXiBtYWNfYXJyYXlbNDFdIF4gbWFjX2FycmF5WzM5XSBeCisJCQltYWNfYXJyYXlbMzZdIF4gbWFjX2FycmF5WzM0XSBeIG1hY19hcnJheVszMl0gXgorCQkJbWFjX2FycmF5WzMwXSBeIG1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjhdIF4KKwkJCW1hY19hcnJheVsyNF0gXiBtYWNfYXJyYXlbMjNdIF4gbWFjX2FycmF5WzIyXSBeCisJCQltYWNfYXJyYXlbMjFdIF4gbWFjX2FycmF5WzIwXSBeIG1hY19hcnJheVsxOF0gXgorCQkJbWFjX2FycmF5WzE3XSBeIG1hY19hcnJheVsxNl0gXiBtYWNfYXJyYXlbMTVdIF4KKwkJCW1hY19hcnJheVsxNF0gXiBtYWNfYXJyYXlbMTNdIF4gbWFjX2FycmF5WzEyXSBeCisJCQltYWNfYXJyYXlbOV0gXiBtYWNfYXJyYXlbNl0gXiBtYWNfYXJyYXlbMV0gXgorCQkJbWFjX2FycmF5WzBdOworCisJCWNyY1syXSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQ0XSBeCisJCQltYWNfYXJyYXlbNDNdIF4gbWFjX2FycmF5WzQyXSBeIG1hY19hcnJheVszOV0gXgorCQkJbWFjX2FycmF5WzM3XSBeIG1hY19hcnJheVszNF0gXiBtYWNfYXJyYXlbMzNdIF4KKwkJCW1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjhdIF4gbWFjX2FycmF5WzI1XSBeCisJCQltYWNfYXJyYXlbMjRdIF4gbWFjX2FycmF5WzIyXSBeIG1hY19hcnJheVsxN10gXgorCQkJbWFjX2FycmF5WzE1XSBeIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTJdIF4KKwkJCW1hY19hcnJheVsxMF0gXiBtYWNfYXJyYXlbOF0gXiBtYWNfYXJyYXlbNl0gXgorCQkJbWFjX2FycmF5WzJdIF4gbWFjX2FycmF5WzFdIF4gbWFjX2FycmF5WzBdOworCisJCWNyY1szXSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDVdIF4gbWFjX2FycmF5WzQ0XSBeCisJCQltYWNfYXJyYXlbNDNdIF4gbWFjX2FycmF5WzQwXSBeIG1hY19hcnJheVszOF0gXgorCQkJbWFjX2FycmF5WzM1XSBeIG1hY19hcnJheVszNF0gXiBtYWNfYXJyYXlbMzBdIF4KKwkJCW1hY19hcnJheVsyOV0gXiBtYWNfYXJyYXlbMjZdIF4gbWFjX2FycmF5WzI1XSBeCisJCQltYWNfYXJyYXlbMjNdIF4gbWFjX2FycmF5WzE4XSBeIG1hY19hcnJheVsxNl0gXgorCQkJbWFjX2FycmF5WzE0XSBeIG1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTFdIF4KKwkJCW1hY19hcnJheVs5XSBeIG1hY19hcnJheVs3XSBeIG1hY19hcnJheVszXSBeCisJCQltYWNfYXJyYXlbMl0gXiBtYWNfYXJyYXlbMV07CisKKwkJY3JjWzRdID0gbWFjX2FycmF5WzQ2XSBeIG1hY19hcnJheVs0NV0gXiBtYWNfYXJyYXlbNDRdIF4KKwkJCW1hY19hcnJheVs0MV0gXiBtYWNfYXJyYXlbMzldIF4gbWFjX2FycmF5WzM2XSBeCisJCQltYWNfYXJyYXlbMzVdIF4gbWFjX2FycmF5WzMxXSBeIG1hY19hcnJheVszMF0gXgorCQkJbWFjX2FycmF5WzI3XSBeIG1hY19hcnJheVsyNl0gXiBtYWNfYXJyYXlbMjRdIF4KKwkJCW1hY19hcnJheVsxOV0gXiBtYWNfYXJyYXlbMTddIF4gbWFjX2FycmF5WzE1XSBeCisJCQltYWNfYXJyYXlbMTRdIF4gbWFjX2FycmF5WzEyXSBeIG1hY19hcnJheVsxMF0gXgorCQkJbWFjX2FycmF5WzhdIF4gbWFjX2FycmF5WzRdIF4gbWFjX2FycmF5WzNdIF4KKwkJCW1hY19hcnJheVsyXTsKKworCQljcmNbNV0gPSBtYWNfYXJyYXlbNDddIF4gbWFjX2FycmF5WzQ2XSBeIG1hY19hcnJheVs0NV0gXgorCQkJbWFjX2FycmF5WzQyXSBeIG1hY19hcnJheVs0MF0gXiBtYWNfYXJyYXlbMzddIF4KKwkJCW1hY19hcnJheVszNl0gXiBtYWNfYXJyYXlbMzJdIF4gbWFjX2FycmF5WzMxXSBeCisJCQltYWNfYXJyYXlbMjhdIF4gbWFjX2FycmF5WzI3XSBeIG1hY19hcnJheVsyNV0gXgorCQkJbWFjX2FycmF5WzIwXSBeIG1hY19hcnJheVsxOF0gXiBtYWNfYXJyYXlbMTZdIF4KKwkJCW1hY19hcnJheVsxNV0gXiBtYWNfYXJyYXlbMTNdIF4gbWFjX2FycmF5WzExXSBeCisJCQltYWNfYXJyYXlbOV0gXiBtYWNfYXJyYXlbNV0gXiBtYWNfYXJyYXlbNF0gXgorCQkJbWFjX2FycmF5WzNdOworCisJCWNyY1s2XSA9IG1hY19hcnJheVs0N10gXiBtYWNfYXJyYXlbNDZdIF4gbWFjX2FycmF5WzQzXSBeCisJCQltYWNfYXJyYXlbNDFdIF4gbWFjX2FycmF5WzM4XSBeIG1hY19hcnJheVszN10gXgorCQkJbWFjX2FycmF5WzMzXSBeIG1hY19hcnJheVszMl0gXiBtYWNfYXJyYXlbMjldIF4KKwkJCW1hY19hcnJheVsyOF0gXiBtYWNfYXJyYXlbMjZdIF4gbWFjX2FycmF5WzIxXSBeCisJCQltYWNfYXJyYXlbMTldIF4gbWFjX2FycmF5WzE3XSBeIG1hY19hcnJheVsxNl0gXgorCQkJbWFjX2FycmF5WzE0XSBeIG1hY19hcnJheVsxMl0gXiBtYWNfYXJyYXlbMTBdIF4KKwkJCW1hY19hcnJheVs2XSBeIG1hY19hcnJheVs1XSBeIG1hY19hcnJheVs0XTsKKworCQljcmNbN10gPSBtYWNfYXJyYXlbNDddIF4gbWFjX2FycmF5WzQ0XSBeIG1hY19hcnJheVs0Ml0gXgorCQkJbWFjX2FycmF5WzM5XSBeIG1hY19hcnJheVszOF0gXiBtYWNfYXJyYXlbMzRdIF4KKwkJCW1hY19hcnJheVszM10gXiBtYWNfYXJyYXlbMzBdIF4gbWFjX2FycmF5WzI5XSBeCisJCQltYWNfYXJyYXlbMjddIF4gbWFjX2FycmF5WzIyXSBeIG1hY19hcnJheVsyMF0gXgorCQkJbWFjX2FycmF5WzE4XSBeIG1hY19hcnJheVsxN10gXiBtYWNfYXJyYXlbMTVdIF4KKwkJCW1hY19hcnJheVsxM10gXiBtYWNfYXJyYXlbMTFdIF4gbWFjX2FycmF5WzddIF4KKwkJCW1hY19hcnJheVs2XSBeIG1hY19hcnJheVs1XTsKKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJY3JjX3Jlc3VsdCA9IGNyY19yZXN1bHQgfCAoY3JjW2ldIDw8IGkpOworCisJCWV0aF9wb3J0X29tY19hZGRyIChldGhfcG9ydF9udW0sIGNyY19yZXN1bHQsIHF1ZXVlLCBvcHRpb24pOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9wb3J0X3NtY19hZGRyIC0gU3BlY2lhbCBNdWx0aWNhc3QgYWRkcmVzcyBzZXR0aW5ncy4KKyoKKyogREVTQ1JJUFRJT046CisqCVRoaXMgcm91dGluZSBjb250cm9scyB0aGUgTVYgZGV2aWNlIHNwZWNpYWwgTUFDIG11bHRpY2FzdCBzdXBwb3J0LgorKglUaGUgU3BlY2lhbCBNdWx0aWNhc3QgVGFibGUgZm9yIE1BQyBhZGRyZXNzZXMgc3VwcG9ydHMgTUFDIG9mIHRoZSBmb3JtCisqCTB4MDEtMDAtNUUtMDAtMDAtWFggKHdoZXJlIFhYIGlzIGJldHdlZW4gMHgwMCBhbmQgMHhfZkYpLgorKglUaGUgTUFDIERBWzc6MF0gYml0cyBhcmUgdXNlZCBhcyBhIHBvaW50ZXIgdG8gdGhlIFNwZWNpYWwgTXVsdGljYXN0CisqCVRhYmxlIGVudHJpZXMgaW4gdGhlIERBLUZpbHRlciB0YWJsZS4KKyoJVGhpcyBmdW5jdGlvbiBzZXQgdGhlIFNwZWNpYWwgTXVsdGljYXN0IFRhYmxlIGFwcHJvcHJpYXRlIGVudHJ5CisqCWFjY29yZGluZyB0byB0aGUgYXJndW1lbnQgZ2l2ZW4uCisqCisqIElOUFVUOgorKglFVEhfUE9SVCAJZXRoX3BvcnRfbnVtICAgICAgUG9ydCBudW1iZXIuCisqCXVuc2lnbmVkIGNoYXIgCW1jX2J5dGUJCU11bHRpY2FzdCBhZGRyIGxhc3QgYnl0ZSAoTUFDIERBWzc6MF0gYml0cykuCisqCUVUSF9RVUVVRSAJCSBxdWV1ZQkJUnggcXVldWUgbnVtYmVyIGZvciB0aGlzIE1BQyBhZGRyZXNzLgorKglpbnQgCQkJb3B0aW9uICAgICAgMCA9IEFkZCwgMSA9IHJlbW92ZSBhZGRyZXNzLgorKgorKiBPVVRQVVQ6CisqCVNlZSBkZXNjcmlwdGlvbi4KKyoKKyogUkVUVVJOOgorKgl0cnVlIGlzIG91dHB1dCBzdWNjZWVkZWQuCisqCWZhbHNlIGlmIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhfcG9ydF9zbWNfYWRkciAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbWNfYnl0ZSwKKwkJCSAgICAgICBFVEhfUVVFVUUgcXVldWUsIGludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IHNtY190YWJsZV9yZWc7CisJdW5zaWduZWQgaW50IHRibF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisKKwkvKiBMb2NhdGUgdGhlIFNNQyB0YWJsZSBlbnRyeSAqLworCXRibF9vZmZzZXQgPSAobWNfYnl0ZSAvIDQpICogNDsJLyogUmVnaXN0ZXIgb2Zmc2V0IGZyb20gU01DIHRhYmxlIGJhc2UgKi8KKwlyZWdfb2Zmc2V0ID0gbWNfYnl0ZSAlIDQ7CS8qIEVudHJ5IG9mZnNldCB3aXRoaW4gdGhlIGFib3ZlIHJlZ2lzdGVyICovCisJcXVldWUgJj0gMHg3OworCisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlIFJFSkVDVF9NQUNfQUREUjoKKwkJLyogQ2xlYXIgYWNjZXB0cyBmcmFtZSBiaXQgYXQgc3BlY2lmaWVkIFNwZWNpYWwgREEgdGFibGUgZW50cnkgKi8KKwkJc21jX3RhYmxlX3JlZyA9CisJCQlNVl9SRUdfUkVBRCAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCkpOworCQlzbWNfdGFibGVfcmVnICY9ICgweDBFIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCksIHNtY190YWJsZV9yZWcpOworCQlicmVhazsKKworCWNhc2UgQUNDRVBUX01BQ19BRERSOgorCQkvKiBTZXQgYWNjZXB0cyBmcmFtZSBiaXQgYXQgc3BlY2lmaWVkIFNwZWNpYWwgREEgdGFibGUgZW50cnkgKi8KKwkJc21jX3RhYmxlX3JlZyA9CisJCQlNVl9SRUdfUkVBRCAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCkpOworCQlzbWNfdGFibGVfcmVnIHw9ICgoMHgwMSB8IHF1ZXVlKSA8PCAoOCAqIHJlZ19vZmZzZXQpKTsKKworCQlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9EQV9GSUxURVJfU1BFQ0lBTF9NVUxUSUNBU1RfVEFCTEVfQkFTRSAoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpLCBzbWNfdGFibGVfcmVnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfcG9ydF9vbWNfYWRkciAtIE11bHRpY2FzdCBhZGRyZXNzIHNldHRpbmdzLgorKgorKiBERVNDUklQVElPTjoKKyoJVGhpcyByb3V0aW5lIGNvbnRyb2xzIHRoZSBNViBkZXZpY2UgT3RoZXIgTUFDIG11bHRpY2FzdCBzdXBwb3J0LgorKglUaGUgT3RoZXIgTXVsdGljYXN0IFRhYmxlIGlzIHVzZWQgZm9yIG11bHRpY2FzdCBvZiBhbm90aGVyIHR5cGUuCisqCUEgQ1JDLThiaXQgaXMgdXNlZCBhcyBhbiBpbmRleCB0byB0aGUgT3RoZXIgTXVsdGljYXN0IFRhYmxlIGVudHJpZXMKKyoJaW4gdGhlIERBLUZpbHRlciB0YWJsZS4KKyoJVGhlIGZ1bmN0aW9uIGdldHMgdGhlIENSQy04Yml0IHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgcm91dGluZSBhbmQKKyogICAgICBzZXQgdGhlIE90aGVyIE11bHRpY2FzdCBUYWJsZSBhcHByb3ByaWF0ZSBlbnRyeSBhY2NvcmRpbmcgdG8gdGhlCisqCUNSQy04IGFyZ3VtZW50IGdpdmVuLgorKgorKiBJTlBVVDoKKyoJRVRIX1BPUlQgCWV0aF9wb3J0X251bSAgICAgIFBvcnQgbnVtYmVyLgorKgl1bnNpZ25lZCBjaGFyIAkgIGNyYzgJCUEgQ1JDLThiaXQgKFBvbHlub21pYWw6IHheOCt4XjIreF4xKzEpLgorKglFVEhfUVVFVUUgCQkgcXVldWUJCVJ4IHF1ZXVlIG51bWJlciBmb3IgdGhpcyBNQUMgYWRkcmVzcy4KKyoJaW50IAkJCW9wdGlvbiAgICAgIDAgPSBBZGQsIDEgPSByZW1vdmUgYWRkcmVzcy4KKyoKKyogT1VUUFVUOgorKglTZWUgZGVzY3JpcHRpb24uCisqCisqIFJFVFVSTjoKKyoJdHJ1ZSBpcyBvdXRwdXQgc3VjY2VlZGVkLgorKglmYWxzZSBpZiBvcHRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfb21jX2FkZHIgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGNyYzgsCisJCQkgICAgICAgRVRIX1FVRVVFIHF1ZXVlLCBpbnQgb3B0aW9uKQoreworCXVuc2lnbmVkIGludCBvbWNfdGFibGVfcmVnOworCXVuc2lnbmVkIGludCB0Ymxfb2Zmc2V0OworCXVuc2lnbmVkIGludCByZWdfb2Zmc2V0OworCisJLyogTG9jYXRlIHRoZSBPTUMgdGFibGUgZW50cnkgKi8KKwl0Ymxfb2Zmc2V0ID0gKGNyYzggLyA0KSAqIDQ7CS8qIFJlZ2lzdGVyIG9mZnNldCBmcm9tIE9NQyB0YWJsZSBiYXNlICovCisJcmVnX29mZnNldCA9IGNyYzggJSA0OwkvKiBFbnRyeSBvZmZzZXQgd2l0aGluIHRoZSBhYm92ZSByZWdpc3RlciAqLworCXF1ZXVlICY9IDB4NzsKKworCXN3aXRjaCAob3B0aW9uKSB7CisJY2FzZSBSRUpFQ1RfTUFDX0FERFI6CisJCS8qIENsZWFyIGFjY2VwdHMgZnJhbWUgYml0IGF0IHNwZWNpZmllZCBPdGhlciBEQSB0YWJsZSBlbnRyeSAqLworCQlvbWNfdGFibGVfcmVnID0KKwkJCU1WX1JFR19SRUFEICgoTVY2NDQ2MF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCkpOworCQlvbWNfdGFibGVfcmVnICY9ICgweDBFIDw8ICg4ICogcmVnX29mZnNldCkpOworCisJCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRSAoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpLCBvbWNfdGFibGVfcmVnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDQ0VQVF9NQUNfQUREUjoKKwkJLyogU2V0IGFjY2VwdHMgZnJhbWUgYml0IGF0IHNwZWNpZmllZCBPdGhlciBEQSB0YWJsZSBlbnRyeSAqLworCQlvbWNfdGFibGVfcmVnID0KKwkJCU1WX1JFR19SRUFEICgoTVY2NDQ2MF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCkpOworCQlvbWNfdGFibGVfcmVnIHw9ICgoMHgwMSB8IHF1ZXVlKSA8PCAoOCAqIHJlZ19vZmZzZXQpKTsKKworCQlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UgKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSwgb21jX3RhYmxlX3JlZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfcG9ydF9pbml0X21hY190YWJsZXMgLSBDbGVhciBhbGwgZW50cmFuY2UgaW4gdGhlIFVDLCBTTUMgYW5kIE9NQyB0YWJsZXMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIEdvIHRocm91Z2ggYWxsIHRoZSBEQSBmaWx0ZXIgdGFibGVzIChVbmljYXN0LCBTcGVjaWFsIE11bHRpY2FzdCAmIE90aGVyCisqICAgICAgIE11bHRpY2FzdCkgYW5kIHNldCBlYWNoIGVudHJ5IHRvIDAuCisqCisqIElOUFVUOgorKglFVEhfUE9SVCAgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisqCisqIE9VVFBVVDoKKyogICAgICAgTXVsdGljYXN0IGFuZCBVbmljYXN0IHBhY2tldHMgYXJlIHJlamVjdGVkLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfaW5pdF9tYWNfdGFibGVzIChFVEhfUE9SVCBldGhfcG9ydF9udW0pCit7CisJaW50IHRhYmxlX2luZGV4OworCisJLyogQ2xlYXIgREEgZmlsdGVyIHVuaWNhc3QgdGFibGUgKEV4X2RGVVQpICovCisJZm9yICh0YWJsZV9pbmRleCA9IDA7IHRhYmxlX2luZGV4IDw9IDB4QzsgdGFibGVfaW5kZXggKz0gNCkKKwkJTVZfUkVHX1dSSVRFICgoTVY2NDQ2MF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJICAgICAgIChldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgpLCAwKTsKKworCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8PSAweEZDOyB0YWJsZV9pbmRleCArPSA0KSB7CisJCS8qIENsZWFyIERBIGZpbHRlciBzcGVjaWFsIG11bHRpY2FzdCB0YWJsZSAoRXhfZEZTTVQpICovCisJCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFIChldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgpLCAwKTsKKwkJLyogQ2xlYXIgREEgZmlsdGVyIG90aGVyIG11bHRpY2FzdCB0YWJsZSAoRXhfZEZPTVQpICovCisJCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRSAoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGhfY2xlYXJfbWliX2NvdW50ZXJzIC0gQ2xlYXIgYWxsIE1JQiBjb3VudGVycworKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBjbGVhcnMgYWxsIE1JQiBjb3VudGVycyBvZiBhIHNwZWNpZmljIGV0aGVybmV0IHBvcnQuCisqICAgICAgIEEgcmVhZCBmcm9tIHRoZSBNSUIgY291bnRlciB3aWxsIHJlc2V0IHRoZSBjb3VudGVyLgorKgorKiBJTlBVVDoKKyoJRVRIX1BPUlQgICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorKgorKiBPVVRQVVQ6CisqICAgICAgIEFmdGVyIHJlYWRpbmcgYWxsIE1JQiBjb3VudGVycywgdGhlIGNvdW50ZXJzIHJlc2V0cy4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNSUIgY291bnRlciB2YWx1ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfY2xlYXJfbWliX2NvdW50ZXJzIChFVEhfUE9SVCBldGhfcG9ydF9udW0pCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGR1bW15OworCisJLyogUGVyZm9ybSBkdW1teSByZWFkcyBmcm9tIE1JQiBjb3VudGVycyAqLworCWZvciAoaSA9IEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfTE9XOyBpIDwgRVRIX01JQl9MQVRFX0NPTExJU0lPTjsKKwkgICAgIGkgKz0gNCkKKwkJZHVtbXkgPSBNVl9SRUdfUkVBRCAoKE1WNjQ0NjBfRVRIX01JQl9DT1VOVEVSU19CQVNFCisJCQkJICAgICAgKGV0aF9wb3J0X251bSkgKyBpKSk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGV0aF9yZWFkX21pYl9jb3VudGVyIC0gUmVhZCBhIE1JQiBjb3VudGVyCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgTUlCIGNvdW50ZXIgb2YgYSBzcGVjaWZpYyBldGhlcm5ldCBwb3J0LgorKiAgICAgICBOT1RFIC0gSWYgcmVhZCBmcm9tIEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfTE9XLCB0aGVuIHRoZQorKiAgICAgICBmb2xsb3dpbmcgcmVhZCBtdXN0IGJlIGZyb20gRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdICisqICAgICAgIHJlZ2lzdGVyLiBUaGUgc2FtZSBhcHBsaWVzIGZvciBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfTE9XIGFuZAorKiAgICAgICBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfSElHSAorKgorKiBJTlBVVDoKKyoJRVRIX1BPUlQgICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorKiAgICAgICB1bnNpZ25lZCBpbnQgbWliX29mZnNldCAgIE1JQiBjb3VudGVyIG9mZnNldCAodXNlIEVUSF9NSUJfLi4uIG1hY3JvcykuCisqCisqIE9VVFBVVDoKKyogICAgICAgQWZ0ZXIgcmVhZGluZyB0aGUgTUlCIGNvdW50ZXIsIHRoZSBjb3VudGVyIHJlc2V0cy4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNSUIgY291bnRlciB2YWx1ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgZXRoX3JlYWRfbWliX2NvdW50ZXIgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbWliX29mZnNldCkKK3sKKwlyZXR1cm4gKE1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9NSUJfQ09VTlRFUlNfQkFTRSAoZXRoX3BvcnRfbnVtKQorCQkJICAgICArIG1pYl9vZmZzZXQpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXRoZXJuZXRfcGh5X3NldCAtIFNldCB0aGUgZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcy4KKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIGV0aGVybmV0IHBvcnQgUEhZIGFkZHJlc3MgYWNjb3JkaW5nIHRvIGdpdmVuCisqICAgICAgIHBhcmFtZXRlci4KKyoKKyogSU5QVVQ6CisqCQlFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyoKKyogT1VUUFVUOgorKiAgICAgICBTZXQgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgd2l0aCBnaXZlbiBQSFkgYWRkcmVzcyBwYXJhbWV0ZXIuCisqCisqIFJFVFVSTjoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9waHlfc2V0IChFVEhfUE9SVCBldGhfcG9ydF9udW0sIGludCBwaHlfYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisKKwlyZWdfZGF0YSA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9QSFlfQUREUl9SRUcpOworCisJcmVnX2RhdGEgJj0gfigweDFGIDw8ICg1ICogZXRoX3BvcnRfbnVtKSk7CisJcmVnX2RhdGEgfD0gKHBoeV9hZGRyIDw8ICg1ICogZXRoX3BvcnRfbnVtKSk7CisKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1BIWV9BRERSX1JFRywgcmVnX2RhdGEpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoZXJuZXRfcGh5X2dldCAtIEdldCB0aGUgZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBnaXZlbiBldGhlcm5ldCBwb3J0IFBIWSBhZGRyZXNzLgorICoKKyAqIElOUFVUOgorICoJCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgIE5vbmUuCisgKgorICogUkVUVVJOOgorICogICAgICAgUEhZIGFkZHJlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGV0aGVybmV0X3BoeV9nZXQgKEVUSF9QT1JUIGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisKKwlyZWdfZGF0YSA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9QSFlfQUREUl9SRUcpOworCisJcmV0dXJuICgocmVnX2RhdGEgPj4gKDUgKiBldGhfcG9ydF9udW0pKSAmIDB4MWYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoZXJuZXRfcGh5X3Jlc2V0IC0gUmVzZXQgRXRoZXJuZXQgcG9ydCBQSFkuCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIHJvdXRpbmUgdXRpbGl6ZSB0aGUgU01JIGludGVyZmFjZSB0byByZXNldCB0aGUgZXRoZXJuZXQgcG9ydCBQSFkuCisgKiAgICAgICBUaGUgcm91dGluZSB3YWl0cyB1bnRpbCB0aGUgbGluayBpcyB1cCBhZ2FpbiBvciBsaW5rIHVwIGlzIHRpbWVvdXQuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgICBUaGUgZXRoZXJuZXQgcG9ydCBQSFkgcmVuZXcgaXRzIGxpbmsuCisgKgorICogUkVUVVJOOgorICogICAgICAgTm9uZS4KKyAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoZXJuZXRfcGh5X3Jlc2V0IChFVEhfUE9SVCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHRpbWVfb3V0ID0gNTA7CisJdW5zaWduZWQgaW50IHBoeV9yZWdfZGF0YTsKKworCS8qIFJlc2V0IHRoZSBQSFkgKi8KKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcgKGV0aF9wb3J0X251bSwgMCwgJnBoeV9yZWdfZGF0YSk7CisJcGh5X3JlZ19kYXRhIHw9IDB4ODAwMDsJLyogU2V0IGJpdCAxNSB0byByZXNldCB0aGUgUEhZICovCisJZXRoX3BvcnRfd3JpdGVfc21pX3JlZyAoZXRoX3BvcnRfbnVtLCAwLCBwaHlfcmVnX2RhdGEpOworCisJLyogUG9sbCBvbiB0aGUgUEhZIExJTksgKi8KKwlkbyB7CisJCWV0aF9wb3J0X3JlYWRfc21pX3JlZyAoZXRoX3BvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhKTsKKworCQlpZiAodGltZV9vdXQtLSA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwl3aGlsZSAoIShwaHlfcmVnX2RhdGEgJiAweDIwKSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3Jlc2V0IC0gUmVzZXQgRXRoZXJuZXQgcG9ydAorICoKKyAqIERFU0NSSVBUSU9OOgorICogCVRoaXMgcm91dGluZSByZXNldHMgdGhlIGNoaXAgYnkgYWJvcnRpbmcgYW55IFNETUEgZW5naW5lIGFjdGl2aXR5IGFuZAorICogICAgICBjbGVhcmluZyB0aGUgTUlCIGNvdW50ZXJzLiBUaGUgUmVjZWl2ZXIgYW5kIHRoZSBUcmFuc21pdCB1bml0IGFyZSBpbgorICogICAgICBpZGxlIHN0YXRlIGFmdGVyIHRoaXMgY29tbWFuZCBpcyBwZXJmb3JtZWQgYW5kIHRoZSBwb3J0IGlzIGRpc2FibGVkLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKgorICogT1VUUFVUOgorICogICAgICAgQ2hhbm5lbCBhY3Rpdml0eSBpcyBoYWx0ZWQuCisgKgorICogUkVUVVJOOgorICogICAgICAgTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3Jlc2V0IChFVEhfUE9SVCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHJlZ19kYXRhOworCisJLyogU3RvcCBUeCBwb3J0IGFjdGl2aXR5LiBDaGVjayBwb3J0IFR4IGFjdGl2aXR5LiAqLworCXJlZ19kYXRhID0KKwkJTVZfUkVHX1JFQUQgKE1WNjQ0NjBfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkgICAgIChldGhfcG9ydF9udW0pKTsKKworCWlmIChyZWdfZGF0YSAmIDB4RkYpIHsKKwkJLyogSXNzdWUgc3RvcCBjb21tYW5kIGZvciBhY3RpdmUgY2hhbm5lbHMgb25seSAqLworCQlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkgICAgICAoZXRoX3BvcnRfbnVtKSwgKHJlZ19kYXRhIDw8IDgpKTsKKworCQkvKiBXYWl0IGZvciBhbGwgVHggYWN0aXZpdHkgdG8gdGVybWluYXRlLiAqLworCQlkbyB7CisJCQkvKiBDaGVjayBwb3J0IGNhdXNlIHJlZ2lzdGVyIHRoYXQgYWxsIFR4IHF1ZXVlcyBhcmUgc3RvcHBlZCAqLworCQkJcmVnX2RhdGEgPQorCQkJCU1WX1JFR19SRUFECisJCQkJKE1WNjQ0NjBfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkJIChldGhfcG9ydF9udW0pKTsKKwkJfQorCQl3aGlsZSAocmVnX2RhdGEgJiAweEZGKTsKKwl9CisKKwkvKiBTdG9wIFJ4IHBvcnQgYWN0aXZpdHkuIENoZWNrIHBvcnQgUnggYWN0aXZpdHkuICovCisJcmVnX2RhdGEgPQorCQlNVl9SRUdfUkVBRCAoTVY2NDQ2MF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRworCQkJICAgICAoZXRoX3BvcnRfbnVtKSk7CisKKwlpZiAocmVnX2RhdGEgJiAweEZGKSB7CisJCS8qIElzc3VlIHN0b3AgY29tbWFuZCBmb3IgYWN0aXZlIGNoYW5uZWxzIG9ubHkgKi8KKwkJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHCisJCQkgICAgICAoZXRoX3BvcnRfbnVtKSwgKHJlZ19kYXRhIDw8IDgpKTsKKworCQkvKiBXYWl0IGZvciBhbGwgUnggYWN0aXZpdHkgdG8gdGVybWluYXRlLiAqLworCQlkbyB7CisJCQkvKiBDaGVjayBwb3J0IGNhdXNlIHJlZ2lzdGVyIHRoYXQgYWxsIFJ4IHF1ZXVlcyBhcmUgc3RvcHBlZCAqLworCQkJcmVnX2RhdGEgPQorCQkJCU1WX1JFR19SRUFECisJCQkJKE1WNjQ0NjBfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcKKwkJCQkgKGV0aF9wb3J0X251bSkpOworCQl9CisJCXdoaWxlIChyZWdfZGF0YSAmIDB4RkYpOworCX0KKworCisJLyogQ2xlYXIgYWxsIE1JQiBjb3VudGVycyAqLworCWV0aF9jbGVhcl9taWJfY291bnRlcnMgKGV0aF9wb3J0X251bSk7CisKKwkvKiBSZXNldCB0aGUgRW5hYmxlIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXJlZ19kYXRhID0KKwkJTVZfUkVHX1JFQUQgKE1WNjQ0NjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHCisJCQkgICAgIChldGhfcG9ydF9udW0pKTsKKwlyZWdfZGF0YSAmPSB+RVRIX1NFUklBTF9QT1JUX0VOQUJMRTsKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICByZWdfZGF0YSk7CisKKwlyZXR1cm47Cit9CisKKyNpZiAwCQkJCS8qIE5vdCBuZWVkZWQgaGVyZSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aGVybmV0X3NldF9jb25maWdfcmVnIC0gU2V0IHNwZWNpZmllZCBiaXRzIGluIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgc3BlY2lmaWVkIGJpdHMgaW4gdGhlIGdpdmVuIGV0aGVybmV0CisgKiAgICAgICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKiAgICAgIHVuc2lnbmVkIGludCAgICB2YWx1ZSAgIDMyIGJpdCB2YWx1ZS4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgIFRoZSBzZXQgYml0cyBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyIGFyZSBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgcmVnaXN0ZXIuCisgKgorICogUkVUVVJOOgorICogICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcgKEVUSF9QT1JUIGV0aF9wb3J0X251bSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgZXRoX2NvbmZpZ19yZWc7CisKKwlldGhfY29uZmlnX3JlZyA9CisJCU1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9QT1JUX0NPTkZJR19SRUcgKGV0aF9wb3J0X251bSkpOworCWV0aF9jb25maWdfcmVnIHw9IHZhbHVlOworCU1WX1JFR19XUklURSAoTVY2NDQ2MF9FVEhfUE9SVF9DT05GSUdfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBldGhfY29uZmlnX3JlZyk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2lmIDAJCQkJLyogRklYTUUgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhlcm5ldF9yZXNldF9jb25maWdfcmVnIC0gUmVzZXQgc3BlY2lmaWVkIGJpdHMgaW4gY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqICAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHNwZWNpZmllZCBiaXRzIGluIHRoZSBnaXZlbiBFdGhlcm5ldAorICogICAgICAgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorICogICAgICB1bnNpZ25lZCBpbnQgICAgdmFsdWUgICAzMiBiaXQgdmFsdWUuCisgKgorICogT1VUUFVUOgorICogICAgICBUaGUgc2V0IGJpdHMgaW4gdGhlIHZhbHVlIHBhcmFtZXRlciBhcmUgcmVzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgcmVnaXN0ZXIuCisgKgorICogUkVUVVJOOgorICogICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfcmVzZXRfY29uZmlnX3JlZyAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IGV0aF9jb25maWdfcmVnOworCisJZXRoX2NvbmZpZ19yZWcgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRworCQkJCSAgICAgIChldGhfcG9ydF9udW0pKTsKKwlldGhfY29uZmlnX3JlZyAmPSB+dmFsdWU7CisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9QT1JUX0NPTkZJR19FWFRFTkRfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBldGhfY29uZmlnX3JlZyk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKworI2lmIDAJCQkJLyogTm90IG5lZWRlZCBoZXJlICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoZXJuZXRfZ2V0X2NvbmZpZ19yZWcgLSBHZXQgdGhlIHBvcnQgY29uZmlndXJhdGlvbiByZWdpc3RlcgorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlIG9mIHRoZSBnaXZlbgorICogICAgICAgZXRoZXJuZXQgcG9ydC4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUICAgZXRoX3BvcnRfbnVtICAgRXRoZXJuZXQgUG9ydCBudW1iZXIuIFNlZSBFVEhfUE9SVCBlbnVtLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgIE5vbmUuCisgKgorICogUkVUVVJOOgorICogICAgICAgUG9ydCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVuc2lnbmVkIGludCBldGhlcm5ldF9nZXRfY29uZmlnX3JlZyAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCBldGhfY29uZmlnX3JlZzsKKworCWV0aF9jb25maWdfcmVnID0gTVZfUkVHX1JFQUQgKE1WNjQ0NjBfRVRIX1BPUlRfQ09ORklHX0VYVEVORF9SRUcKKwkJCQkgICAgICAoZXRoX3BvcnRfbnVtKSk7CisJcmV0dXJuIGV0aF9jb25maWdfcmVnOworfQorCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3JlYWRfc21pX3JlZyAtIFJlYWQgUEhZIHJlZ2lzdGVycworICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyByb3V0aW5lIHV0aWxpemUgdGhlIFNNSSBpbnRlcmZhY2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgUEhZIGluCisgKiAgICAgICBvcmRlciB0byBwZXJmb3JtIFBIWSByZWdpc3RlciByZWFkLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKiAgICAgICB1bnNpZ25lZCBpbnQgICBwaHlfcmVnICAgUEhZIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0LgorICogICAgICAgdW5zaWduZWQgaW50ICAgKnZhbHVlICAgUmVnaXN0ZXIgdmFsdWUgYnVmZmVyLgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgIFdyaXRlIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmllZCBQSFkgcmVnaXN0ZXIgaW50byBnaXZlbiBidWZmZXIuCisgKgorICogUkVUVVJOOgorICogICAgICAgZmFsc2UgaWYgdGhlIFBIWSBpcyBidXN5IG9yIHJlYWQgZGF0YSBpcyBub3QgaW4gdmFsaWQgc3RhdGUuCisgKiAgICAgICB0cnVlIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIGV0aF9wb3J0X3JlYWRfc21pX3JlZyAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgIHVuc2lnbmVkIGludCBwaHlfcmVnLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsdWU7CisJdW5zaWduZWQgaW50IHRpbWVfb3V0ID0gUEhZX0JVU1lfVElNRU9VVDsKKwlpbnQgcGh5X2FkZHI7CisKKwlwaHlfYWRkciA9IGV0aGVybmV0X3BoeV9nZXQgKGV0aF9wb3J0X251bSk7CisvKiAgICBwcmludGYoIiAgICAgUGh5LVBvcnQgJWQgaGFzIGFkZGVzcyAlZCAgXG4iLGV0aF9wb3J0X251bSwgcGh5X2FkZHIgKTsqLworCisJLyogZmlyc3QgY2hlY2sgdGhhdCBpdCBpcyBub3QgYnVzeSAqLworCWRvIHsKKwkJcmVnX3ZhbHVlID0gTVZfUkVHX1JFQUQgKE1WNjQ0NjBfRVRIX1NNSV9SRUcpOworCQlpZiAodGltZV9vdXQtLSA9PSAwKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJd2hpbGUgKHJlZ192YWx1ZSAmIEVUSF9TTUlfQlVTWSk7CisKKwkvKiBub3QgYnVzeSAqLworCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9TTUlfUkVHLAorCQkgICAgICAocGh5X2FkZHIgPDwgMTYpIHwgKHBoeV9yZWcgPDwgMjEpIHwKKwkJICAgICAgRVRIX1NNSV9PUENPREVfUkVBRCk7CisKKwl0aW1lX291dCA9IFBIWV9CVVNZX1RJTUVPVVQ7CS8qIGluaXRpYWxpemUgdGhlIHRpbWUgb3V0IHZhciBhZ2FpbiAqLworCisJZG8geworCQlyZWdfdmFsdWUgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9FVEhfU01JX1JFRyk7CisJCWlmICh0aW1lX291dC0tID09IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwl3aGlsZSAoKHJlZ192YWx1ZSAmIEVUSF9TTUlfUkVBRF9WQUxJRCkgIT0gRVRIX1NNSV9SRUFEX1ZBTElEKTsJLyogQml0IHNldCBlcXUgb3BlcmF0aW9uIGRvbmUgKi8KKworCS8qIFdhaXQgZm9yIHRoZSBkYXRhIHRvIHVwZGF0ZSBpbiB0aGUgU01JIHJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9VUERBVEVfVElNRU9VVAkxMDAwMAorCWZvciAodGltZV9vdXQgPSAwOyB0aW1lX291dCA8IFBIWV9VUERBVEVfVElNRU9VVDsgdGltZV9vdXQrKyk7CisKKwlyZWdfdmFsdWUgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9FVEhfU01JX1JFRyk7CisKKwkqdmFsdWUgPSByZWdfdmFsdWUgJiAweGZmZmY7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3dyaXRlX3NtaV9yZWcgLSBXcml0ZSB0byBQSFkgcmVnaXN0ZXJzCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIHJvdXRpbmUgdXRpbGl6ZSB0aGUgU01JIGludGVyZmFjZSB0byBpbnRlcmFjdCB3aXRoIHRoZSBQSFkgaW4KKyAqICAgICAgIG9yZGVyIHRvIHBlcmZvcm0gd3JpdGVzIHRvIFBIWSByZWdpc3RlcnMuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVCAgIGV0aF9wb3J0X251bSAgIEV0aGVybmV0IFBvcnQgbnVtYmVyLiBTZWUgRVRIX1BPUlQgZW51bS4KKyAqICAgICAgdW5zaWduZWQgaW50ICAgcGh5X3JlZyAgIFBIWSByZWdpc3RlciBhZGRyZXNzIG9mZnNldC4KKyAqICAgICAgdW5zaWduZWQgaW50ICAgIHZhbHVlICAgUmVnaXN0ZXIgdmFsdWUuCisgKgorICogT1VUUFVUOgorICogICAgICBXcml0ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBQSFkgcmVnaXN0ZXIuCisgKgorICogUkVUVVJOOgorICogICAgICBmYWxzZSBpZiB0aGUgUEhZIGlzIGJ1c3kuCisgKiAgICAgIHRydWUgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJvb2wgZXRoX3BvcnRfd3JpdGVfc21pX3JlZyAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcGh5X3JlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsdWU7CisJdW5zaWduZWQgaW50IHRpbWVfb3V0ID0gUEhZX0JVU1lfVElNRU9VVDsKKwlpbnQgcGh5X2FkZHI7CisKKwlwaHlfYWRkciA9IGV0aGVybmV0X3BoeV9nZXQgKGV0aF9wb3J0X251bSk7CisKKwkvKiBmaXJzdCBjaGVjayB0aGF0IGl0IGlzIG5vdCBidXN5ICovCisJZG8geworCQlyZWdfdmFsdWUgPSBNVl9SRUdfUkVBRCAoTVY2NDQ2MF9FVEhfU01JX1JFRyk7CisJCWlmICh0aW1lX291dC0tID09IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwl3aGlsZSAocmVnX3ZhbHVlICYgRVRIX1NNSV9CVVNZKTsKKworCS8qIG5vdCBidXN5ICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9TTUlfUkVHLAorCQkgICAgICAocGh5X2FkZHIgPDwgMTYpIHwgKHBoeV9yZWcgPDwgMjEpIHwKKwkJICAgICAgRVRIX1NNSV9PUENPREVfV1JJVEUgfCAodmFsdWUgJiAweGZmZmYpKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9zZXRfYWNjZXNzX2NvbnRyb2wgLSBDb25maWcgYWRkcmVzcyBkZWNvZGUgcGFyYW1ldGVycyBmb3IgRXRoZXJuZXQgdW5pdAorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBhZGRyZXNzIGRlY29kZSBwYXJhbWV0ZXJzIGZvciB0aGUgR2lnYWJpdAorICogICAgICAgRXRoZXJuZXQgQ29udHJvbGxlciBhY2NvcmRpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMgc3RydWN0LgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgICBldGhfcG9ydF9udW0gICBFdGhlcm5ldCBQb3J0IG51bWJlci4gU2VlIEVUSF9QT1JUIGVudW0uCisgKiAgICAgICBFVEhfV0lOX1BBUkFNICAqcGFyYW0gICBBZGRyZXNzIGRlY29kZSBwYXJhbWV0ZXIgc3RydWN0LgorICoKKyAqIE9VVFBVVDoKKyAqICAgICAgIEFuIGFjY2VzcyB3aW5kb3cgaXMgb3BlbmVkIHVzaW5nIHRoZSBnaXZlbiBhY2Nlc3MgcGFyYW1ldGVycy4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgICBOb25lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZXRoX3NldF9hY2Nlc3NfY29udHJvbCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgICBFVEhfV0lOX1BBUkFNICogcGFyYW0pCit7CisJdW5zaWduZWQgaW50IGFjY2Vzc19wcm90X3JlZzsKKworCS8qIFNldCBhY2Nlc3MgY29udHJvbCByZWdpc3RlciAqLworCWFjY2Vzc19wcm90X3JlZyA9IE1WX1JFR19SRUFEIChNVjY0NDYwX0VUSF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcKKwkJCQkgICAgICAgKGV0aF9wb3J0X251bSkpOworCWFjY2Vzc19wcm90X3JlZyAmPSAofigzIDw8IChwYXJhbS0+d2luICogMikpKTsJLyogY2xlYXIgd2luZG93IHBlcm1pc3Npb24gKi8KKwlhY2Nlc3NfcHJvdF9yZWcgfD0gKHBhcmFtLT5hY2Nlc3NfY3RybCA8PCAocGFyYW0tPndpbiAqIDIpKTsKKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX0FDQ0VTU19QUk9URUNUSU9OX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgYWNjZXNzX3Byb3RfcmVnKTsKKworCS8qIFNldCB3aW5kb3cgU2l6ZSByZWcgKFNSKSAqLworCU1WX1JFR19XUklURSAoKE1WNjQ0NjBfRVRIX1NJWkVfUkVHXzAgKworCQkgICAgICAgKEVUSF9TSVpFX1JFR19HQVAgKiBwYXJhbS0+d2luKSksCisJCSAgICAgICgoKHBhcmFtLT5zaXplIC8gMHgxMDAwMCkgLSAxKSA8PCAxNikpOworCisJLyogU2V0IHdpbmRvdyBCYXNlIGFkZHJlc3MgcmVnIChCQSkgKi8KKwlNVl9SRUdfV1JJVEUgKChNVjY0NDYwX0VUSF9CQVJfMCArIChFVEhfQkFSX0dBUCAqIHBhcmFtLT53aW4pKSwKKwkJICAgICAgKHBhcmFtLT50YXJnZXQgfCBwYXJhbS0+YXR0cmlidXRlcyB8IHBhcmFtLT5iYXNlX2FkZHIpKTsKKwkvKiBIaWdoIGFkZHJlc3MgcmVtYXAgcmVnIChIQVJSKSAqLworCWlmIChwYXJhbS0+d2luIDwgNCkKKwkJTVZfUkVHX1dSSVRFICgoTVY2NDQ2MF9FVEhfSElHSF9BRERSX1JFTUFQX1JFR18wICsKKwkJCSAgICAgICAoRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfR0FQICogcGFyYW0tPndpbikpLAorCQkJICAgICAgcGFyYW0tPmhpZ2hfYWRkcik7CisKKwkvKiBCYXNlIGFkZHJlc3MgZW5hYmxlIHJlZyAoQkFSRVIpICovCisJaWYgKHBhcmFtLT5lbmFibGUgPT0gMSkKKwkJTVZfUkVTRVRfUkVHX0JJVFMgKE1WNjQ0NjBfRVRIX0JBU0VfQUREUl9FTkFCTEVfUkVHLAorCQkJCSAgICgxIDw8IHBhcmFtLT53aW4pKTsKKwllbHNlCisJCU1WX1NFVF9SRUdfQklUUyAoTVY2NDQ2MF9FVEhfQkFTRV9BRERSX0VOQUJMRV9SRUcsCisJCQkJICgxIDw8IHBhcmFtLT53aW4pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nIC0gQ3VydmUgYSBSeCBjaGFpbiBkZXNjIGxpc3QgYW5kIGJ1ZmZlciBpbiBtZW1vcnkuCisgKgorICogREVTQ1JJUFRJT046CisgKiAgICAgICBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgUnggY2hhaW5lZCBsaXN0IG9mIGRlc2NyaXB0b3JzIGFuZCBwYWNrZXQKKyAqICAgICAgIGJ1ZmZlcnMgaW4gYSBmb3JtIG9mIGEgcmluZy4gVGhlIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcG9ydAorICogICAgICAgaW5pdGlhbGl6YXRpb24gcm91dGluZSBhbmQgYmVmb3JlIHBvcnQgc3RhcnQgcm91dGluZS4KKyAqICAgICAgIFRoZSBFdGhlcm5ldCBTRE1BIGVuZ2luZSB1c2VzIENQVSBidXMgYWRkcmVzc2VzIHRvIGFjY2VzcyB0aGUgdmFyaW91cworICogICAgICAgZGV2aWNlcyBpbiB0aGUgc3lzdGVtIChpLmUuIERSQU0pLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGV0aGVybmV0CisgKiAgICAgICBzdHJ1Y3QgJ3ZpcnR1YWwgdG8gcGh5c2ljYWwnIHJvdXRpbmUgKHNldCBieSB0aGUgdXNlcikgdG8gc2V0IHRoZSByaW5nCisgKiAgICAgICB3aXRoIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAlyeF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBSeCBxdWV1ZS4KKyAqICAgICAgaW50IAkJCXJ4X2Rlc2NfbnVtICAgICAgIE51bWJlciBvZiBSeCBkZXNjcmlwdG9ycworICogICAgICBpbnQgCQkJcnhfYnVmZl9zaXplICAgICAgU2l6ZSBvZiBSeCBidWZmZXIKKyAqICAgICAgdW5zaWduZWQgaW50ICAgIHJ4X2Rlc2NfYmFzZV9hZGRyICBSeCBkZXNjcmlwdG9ycyBtZW1vcnkgYXJlYSBiYXNlIGFkZHIuCisgKiAgICAgIHVuc2lnbmVkIGludCAgICByeF9idWZmX2Jhc2VfYWRkciAgUnggYnVmZmVyIG1lbW9yeSBhcmVhIGJhc2UgYWRkci4KKyAqCisgKiBPVVRQVVQ6CisgKiAgICAgIFRoZSByb3V0aW5lIHVwZGF0ZXMgdGhlIEV0aGVybmV0IHBvcnQgY29udHJvbCBzdHJ1Y3Qgd2l0aCBpbmZvcm1hdGlvbgorICogICAgICByZWdhcmRpbmcgdGhlIFJ4IGRlc2NyaXB0b3JzIGFuZCBidWZmZXJzLgorICoKKyAqIFJFVFVSTjoKKyAqICAgICAgZmFsc2UgaWYgdGhlIGdpdmVuIGRlc2NyaXB0b3JzIG1lbW9yeSBhcmVhIGlzIG5vdCBhbGlnbmVkIGFjY29yZGluZyB0bworICogICAgICBFdGhlcm5ldCBTRE1BIHNwZWNpZmljYXRpb25zLgorICogICAgICB0cnVlIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nIChFVEhfUE9SVF9JTkZPICogcF9ldGhfcG9ydF9jdHJsLAorCQkJCSAgICAgRVRIX1FVRVVFIHJ4X3F1ZXVlLAorCQkJCSAgICAgaW50IHJ4X2Rlc2NfbnVtLAorCQkJCSAgICAgaW50IHJ4X2J1ZmZfc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByeF9kZXNjX2Jhc2VfYWRkciwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByeF9idWZmX2Jhc2VfYWRkcikKK3sKKwlFVEhfUlhfREVTQyAqcF9yeF9kZXNjOworCUVUSF9SWF9ERVNDICpwX3J4X3ByZXZfZGVzYzsJLyogcG9pbnRlciB0byBsaW5rIHdpdGggdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCXVuc2lnbmVkIGludCBidWZmZXJfYWRkcjsKKwlpbnQgaXg7CQkJLyogYSBjb3VudGVyICovCisKKworCXBfcnhfZGVzYyA9IChFVEhfUlhfREVTQyAqKSByeF9kZXNjX2Jhc2VfYWRkcjsKKwlwX3J4X3ByZXZfZGVzYyA9IHBfcnhfZGVzYzsKKwlidWZmZXJfYWRkciA9IHJ4X2J1ZmZfYmFzZV9hZGRyOworCisJLyogUnggZGVzYyBNdXN0IGJlIDRMVyBhbGlnbmVkIChpLmUuIERlc2NyaXB0b3JfQWRkcmVzc1szOjBdPTAwMDApLiAqLworCWlmIChyeF9idWZmX2Jhc2VfYWRkciAmIDB4RikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogUnggYnVmZmVycyBhcmUgbGltaXRlZCB0byA2NEsgYnl0ZXMgYW5kIE1pbmltdW0gc2l6ZSBpcyA4IGJ5dGVzICAqLworCWlmICgocnhfYnVmZl9zaXplIDwgOCkgfHwgKHJ4X2J1ZmZfc2l6ZSA+IFJYX0JVRkZFUl9NQVhfU0laRSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFJ4IGJ1ZmZlcnMgbXVzdCBiZSA2NC1iaXQgYWxpZ25lZC4gICAgICAgKi8KKwlpZiAoKHJ4X2J1ZmZfYmFzZV9hZGRyICsgcnhfYnVmZl9zaXplKSAmIDB4NykKKwkJcmV0dXJuIGZhbHNlOworCisJLyogaW5pdGlhbGl6ZSB0aGUgUnggZGVzY3JpcHRvcnMgcmluZyAqLworCWZvciAoaXggPSAwOyBpeCA8IHJ4X2Rlc2NfbnVtOyBpeCsrKSB7CisJCXBfcnhfZGVzYy0+YnVmX3NpemUgPSByeF9idWZmX3NpemU7CisJCXBfcnhfZGVzYy0+Ynl0ZV9jbnQgPSAweDAwMDA7CisJCXBfcnhfZGVzYy0+Y21kX3N0cyA9CisJCQlFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSB8IEVUSF9SWF9FTkFCTEVfSU5URVJSVVBUOworCQlwX3J4X2Rlc2MtPm5leHRfZGVzY19wdHIgPQorCQkJKCh1bnNpZ25lZCBpbnQpIHBfcnhfZGVzYykgKyBSWF9ERVNDX0FMSUdORURfU0laRTsKKwkJcF9yeF9kZXNjLT5idWZfcHRyID0gYnVmZmVyX2FkZHI7CisJCXBfcnhfZGVzYy0+cmV0dXJuX2luZm8gPSAweDAwMDAwMDAwOworCQlEX0NBQ0hFX0ZMVVNIX0xJTkUgKHBfcnhfZGVzYywgMCk7CisJCWJ1ZmZlcl9hZGRyICs9IHJ4X2J1ZmZfc2l6ZTsKKwkJcF9yeF9wcmV2X2Rlc2MgPSBwX3J4X2Rlc2M7CisJCXBfcnhfZGVzYyA9IChFVEhfUlhfREVTQyAqKQorCQkJKCh1bnNpZ25lZCBpbnQpIHBfcnhfZGVzYyArIFJYX0RFU0NfQUxJR05FRF9TSVpFKTsKKwl9CisKKwkvKiBDbG9zaW5nIFJ4IGRlc2NyaXB0b3JzIHJpbmcgKi8KKwlwX3J4X3ByZXZfZGVzYy0+bmV4dF9kZXNjX3B0ciA9IChyeF9kZXNjX2Jhc2VfYWRkcik7CisJRF9DQUNIRV9GTFVTSF9MSU5FIChwX3J4X3ByZXZfZGVzYywgMCk7CisKKwkvKiBTYXZlIFJ4IGRlc2MgcG9pbnRlciB0byBkcml2ZXIgc3RydWN0LiAqLworCUNVUlJfUkZEX1NFVCAoKEVUSF9SWF9ERVNDICopIHJ4X2Rlc2NfYmFzZV9hZGRyLCByeF9xdWV1ZSk7CisJVVNFRF9SRkRfU0VUICgoRVRIX1JYX0RFU0MgKikgcnhfZGVzY19iYXNlX2FkZHIsIHJ4X3F1ZXVlKTsKKworCXBfZXRoX3BvcnRfY3RybC0+cF9yeF9kZXNjX2FyZWFfYmFzZVtyeF9xdWV1ZV0gPQorCQkoRVRIX1JYX0RFU0MgKikgcnhfZGVzY19iYXNlX2FkZHI7CisJcF9ldGhfcG9ydF9jdHJsLT5yeF9kZXNjX2FyZWFfc2l6ZVtyeF9xdWV1ZV0gPQorCQlyeF9kZXNjX251bSAqIFJYX0RFU0NfQUxJR05FRF9TSVpFOworCisJcF9ldGhfcG9ydF9jdHJsLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQgfD0gKDEgPDwgcnhfcXVldWUpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyAtIEN1cnZlIGEgVHggY2hhaW4gZGVzYyBsaXN0IGFuZCBidWZmZXIgaW4gbWVtb3J5LgorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBhIFR4IGNoYWluZWQgbGlzdCBvZiBkZXNjcmlwdG9ycyBhbmQgcGFja2V0CisgKiAgICAgICBidWZmZXJzIGluIGEgZm9ybSBvZiBhIHJpbmcuIFRoZSByb3V0aW5lIG11c3QgYmUgY2FsbGVkIGFmdGVyIHBvcnQKKyAqICAgICAgIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgYW5kIGJlZm9yZSBwb3J0IHN0YXJ0IHJvdXRpbmUuCisgKiAgICAgICBUaGUgRXRoZXJuZXQgU0RNQSBlbmdpbmUgdXNlcyBDUFUgYnVzIGFkZHJlc3NlcyB0byBhY2Nlc3MgdGhlIHZhcmlvdXMKKyAqICAgICAgIGRldmljZXMgaW4gdGhlIHN5c3RlbSAoaS5lLiBEUkFNKS4gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBldGhlcm5ldAorICogICAgICAgc3RydWN0ICd2aXJ0dWFsIHRvIHBoeXNpY2FsJyByb3V0aW5lIChzZXQgYnkgdGhlIHVzZXIpIHRvIHNldCB0aGUgcmluZworICogICAgICAgd2l0aCBwaHlzaWNhbCBhZGRyZXNzZXMuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVF9JTkZPICAgKnBfZXRoX3BvcnRfY3RybCAgIEV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKglFVEhfUVVFVUUgICAJdHhfcXVldWUgICAgICAgICBOdW1iZXIgb2YgVHggcXVldWUuCisgKiAgICAgIGludCAJCQl0eF9kZXNjX251bSAgICAgICBOdW1iZXIgb2YgVHggZGVzY3JpcHRvcnMKKyAqICAgICAgaW50IAkJCXR4X2J1ZmZfc2l6ZSAgICAgIFNpemUgb2YgVHggYnVmZmVyCisgKiAgICAgIHVuc2lnbmVkIGludCAgICB0eF9kZXNjX2Jhc2VfYWRkciAgVHggZGVzY3JpcHRvcnMgbWVtb3J5IGFyZWEgYmFzZSBhZGRyLgorICogICAgICB1bnNpZ25lZCBpbnQgICAgdHhfYnVmZl9iYXNlX2FkZHIgIFR4IGJ1ZmZlciBtZW1vcnkgYXJlYSBiYXNlIGFkZHIuCisgKgorICogT1VUUFVUOgorICogICAgICBUaGUgcm91dGluZSB1cGRhdGVzIHRoZSBFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0IHdpdGggaW5mb3JtYXRpb24KKyAqICAgICAgcmVnYXJkaW5nIHRoZSBUeCBkZXNjcmlwdG9ycyBhbmQgYnVmZmVycy4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgIGZhbHNlIGlmIHRoZSBnaXZlbiBkZXNjcmlwdG9ycyBtZW1vcnkgYXJlYSBpcyBub3QgYWxpZ25lZCBhY2NvcmRpbmcgdG8KKyAqICAgICAgRXRoZXJuZXQgU0RNQSBzcGVjaWZpY2F0aW9ucy4KKyAqICAgICAgdHJ1ZSBvdGhlcndpc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbCBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyAoRVRIX1BPUlRfSU5GTyAqIHBfZXRoX3BvcnRfY3RybCwKKwkJCQkgICAgIEVUSF9RVUVVRSB0eF9xdWV1ZSwKKwkJCQkgICAgIGludCB0eF9kZXNjX251bSwKKwkJCQkgICAgIGludCB0eF9idWZmX3NpemUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdHhfZGVzY19iYXNlX2FkZHIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgdHhfYnVmZl9iYXNlX2FkZHIpCit7CisKKwlFVEhfVFhfREVTQyAqcF90eF9kZXNjOworCUVUSF9UWF9ERVNDICpwX3R4X3ByZXZfZGVzYzsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyX2FkZHI7CisJaW50IGl4OwkJCS8qIGEgY291bnRlciAqLworCisKKwkvKiBzYXZlIHRoZSBmaXJzdCBkZXNjIHBvaW50ZXIgdG8gbGluayB3aXRoIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwlwX3R4X2Rlc2MgPSAoRVRIX1RYX0RFU0MgKikgdHhfZGVzY19iYXNlX2FkZHI7CisJcF90eF9wcmV2X2Rlc2MgPSBwX3R4X2Rlc2M7CisJYnVmZmVyX2FkZHIgPSB0eF9idWZmX2Jhc2VfYWRkcjsKKworCS8qIFR4IGRlc2MgTXVzdCBiZSA0TFcgYWxpZ25lZCAoaS5lLiBEZXNjcmlwdG9yX0FkZHJlc3NbMzowXT0wMDAwKS4gKi8KKwlpZiAodHhfYnVmZl9iYXNlX2FkZHIgJiAweEYpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFR4IGJ1ZmZlcnMgYXJlIGxpbWl0ZWQgdG8gNjRLIGJ5dGVzIGFuZCBNaW5pbXVtIHNpemUgaXMgOCBieXRlcyAgKi8KKwlpZiAoKHR4X2J1ZmZfc2l6ZSA+IFRYX0JVRkZFUl9NQVhfU0laRSkKKwkgICAgfHwgKHR4X2J1ZmZfc2l6ZSA8IFRYX0JVRkZFUl9NSU5fU0laRSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIEluaXRpYWxpemUgdGhlIFR4IGRlc2NyaXB0b3JzIHJpbmcgKi8KKwlmb3IgKGl4ID0gMDsgaXggPCB0eF9kZXNjX251bTsgaXgrKykgeworCQlwX3R4X2Rlc2MtPmJ5dGVfY250ID0gMHgwMDAwOworCQlwX3R4X2Rlc2MtPmw0aV9jaGsgPSAweDAwMDA7CisJCXBfdHhfZGVzYy0+Y21kX3N0cyA9IDB4MDAwMDAwMDA7CisJCXBfdHhfZGVzYy0+bmV4dF9kZXNjX3B0ciA9CisJCQkoKHVuc2lnbmVkIGludCkgcF90eF9kZXNjKSArIFRYX0RFU0NfQUxJR05FRF9TSVpFOworCisJCXBfdHhfZGVzYy0+YnVmX3B0ciA9IGJ1ZmZlcl9hZGRyOworCQlwX3R4X2Rlc2MtPnJldHVybl9pbmZvID0gMHgwMDAwMDAwMDsKKwkJRF9DQUNIRV9GTFVTSF9MSU5FIChwX3R4X2Rlc2MsIDApOworCQlidWZmZXJfYWRkciArPSB0eF9idWZmX3NpemU7CisJCXBfdHhfcHJldl9kZXNjID0gcF90eF9kZXNjOworCQlwX3R4X2Rlc2MgPSAoRVRIX1RYX0RFU0MgKikKKwkJCSgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2MgKyBUWF9ERVNDX0FMSUdORURfU0laRSk7CisKKwl9CisJLyogQ2xvc2luZyBUeCBkZXNjcmlwdG9ycyByaW5nICovCisJcF90eF9wcmV2X2Rlc2MtPm5leHRfZGVzY19wdHIgPSB0eF9kZXNjX2Jhc2VfYWRkcjsKKwlEX0NBQ0hFX0ZMVVNIX0xJTkUgKHBfdHhfcHJldl9kZXNjLCAwKTsKKwkvKiBTZXQgVHggZGVzYyBwb2ludGVyIGluIGRyaXZlciBzdHJ1Y3QuICovCisJQ1VSUl9URkRfU0VUICgoRVRIX1RYX0RFU0MgKikgdHhfZGVzY19iYXNlX2FkZHIsIHR4X3F1ZXVlKTsKKwlVU0VEX1RGRF9TRVQgKChFVEhfVFhfREVTQyAqKSB0eF9kZXNjX2Jhc2VfYWRkciwgdHhfcXVldWUpOworCisJLyogSW5pdCBUeCByaW5nIGJhc2UgYW5kIHNpemUgcGFyYW1ldGVycyAqLworCXBfZXRoX3BvcnRfY3RybC0+cF90eF9kZXNjX2FyZWFfYmFzZVt0eF9xdWV1ZV0gPQorCQkoRVRIX1RYX0RFU0MgKikgdHhfZGVzY19iYXNlX2FkZHI7CisJcF9ldGhfcG9ydF9jdHJsLT50eF9kZXNjX2FyZWFfc2l6ZVt0eF9xdWV1ZV0gPQorCQkodHhfZGVzY19udW0gKiBUWF9ERVNDX0FMSUdORURfU0laRSk7CisKKwkvKiBBZGQgdGhlIHF1ZXVlIHRvIHRoZSBsaXN0IG9mIFR4IHF1ZXVlcyBvZiB0aGlzIHBvcnQgKi8KKwlwX2V0aF9wb3J0X2N0cmwtPnBvcnRfdHhfcXVldWVfY29tbWFuZCB8PSAoMSA8PCB0eF9xdWV1ZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3NlbmQgLSBTZW5kIGFuIEV0aGVybmV0IHBhY2tldAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHNlbmQgYSBnaXZlbiBwYWNrZXQgZGVzY3JpYmVkIGJ5IHBfcGt0aW5mbyBwYXJhbWV0ZXIuIEl0CisgKiAgICAgIHN1cHBvcnRzIHRyYW5zbWl0dGluZyBvZiBhIHBhY2tldCBzcGFuZWQgb3ZlciBtdWx0aXBsZSBidWZmZXJzLiBUaGUKKyAqICAgICAgcm91dGluZSB1cGRhdGVzICdjdXJyJyBhbmQgJ2ZpcnN0JyBpbmRleGVzIGFjY29yZGluZyB0byB0aGUgcGFja2V0CisgKiAgICAgIHNlZ21lbnQgcGFzc2VkIHRvIHRoZSByb3V0aW5lLiBJbiBjYXNlIHRoZSBwYWNrZXQgc2VnbWVudCBpcyBmaXJzdCwKKyAqICAgICAgdGhlICdmaXJzdCcgaW5kZXggaXMgdXBkYXRlLiBJbiBhbnkgY2FzZSwgdGhlICdjdXJyJyBpbmRleCBpcyB1cGRhdGVkLgorICogICAgICBJZiB0aGUgcm91dGluZSBnZXQgaW50byBUeCByZXNvdXJjZSBlcnJvciBpdCBhc3NpZ25zICdjdXJyJyBpbmRleCBhcworICogICAgICAnZmlyc3QnLiBUaGlzIHdheSB0aGUgZnVuY3Rpb24gY2FuIGFib3J0IFR4IHByb2Nlc3Mgb2YgbXVsdGlwbGUKKyAqICAgICAgZGVzY3JpcHRvcnMgcGVyIHBhY2tldC4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAl0eF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBUeCBxdWV1ZS4KKyAqCVBLVF9JTkZPICAgICAgICAqcF9wa3RfaW5mbyAgICAgICBVc2VyIHBhY2tldCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJVHggcmluZyAnY3VycicgYW5kICdmaXJzdCcgaW5kZXhlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBSRVRVUk46CisgKiAgICAgIEVUSF9RVUVVRV9GVUxMIGluIGNhc2Ugb2YgVHggcmVzb3VyY2UgZXJyb3IuCisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmcuCisgKglFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRSBpZiB0aGUgcm91dGluZSB1c2VzIHRoZSBsYXN0IFR4IHJlc291cmNlLgorICogICAgICBFVEhfT0sgb3RoZXJ3aXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3BvcnRfc2VuZCAoRVRIX1BPUlRfSU5GTyAqIHBfZXRoX3BvcnRfY3RybCwKKwkJCQkJICBFVEhfUVVFVUUgdHhfcXVldWUsCisJCQkJCSAgUEtUX0lORk8gKiBwX3BrdF9pbmZvKQoreworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2Rlc2NfZmlyc3Q7CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfZGVzY19jdXJyOworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X25leHRfZGVzY19jdXJyOworCXZvbGF0aWxlIEVUSF9UWF9ERVNDICpwX3R4X2Rlc2NfdXNlZDsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9zdGF0dXM7CisKKwkvKiBEbyBub3QgcHJvY2VzcyBUeCByaW5nIGluIGNhc2Ugb2YgVHggcmluZyByZXNvdXJjZSBlcnJvciAqLworCWlmIChwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2Vyclt0eF9xdWV1ZV0gPT0gdHJ1ZSkKKwkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOworCisJLyogR2V0IHRoZSBUeCBEZXNjIHJpbmcgaW5kZXhlcyAqLworCUNVUlJfVEZEX0dFVCAocF90eF9kZXNjX2N1cnIsIHR4X3F1ZXVlKTsKKwlVU0VEX1RGRF9HRVQgKHBfdHhfZGVzY191c2VkLCB0eF9xdWV1ZSk7CisKKwlpZiAocF90eF9kZXNjX2N1cnIgPT0gTlVMTCkKKwkJcmV0dXJuIEVUSF9FUlJPUjsKKworCS8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBzYXZlIHJlYWRpbmdzIGZyb20gbWVtb3J5ICovCisJcF90eF9uZXh0X2Rlc2NfY3VyciA9IFRYX05FWFRfREVTQ19QVFIgKHBfdHhfZGVzY19jdXJyLCB0eF9xdWV1ZSk7CisJY29tbWFuZF9zdGF0dXMgPSBwX3BrdF9pbmZvLT5jbWRfc3RzIHwgRVRIX1pFUk9fUEFERElORyB8IEVUSF9HRU5fQ1JDOworCisJaWYgKGNvbW1hbmRfc3RhdHVzICYgKEVUSF9UWF9GSVJTVF9ERVNDKSkgeworCQkvKiBVcGRhdGUgZmlyc3QgZGVzYyAqLworCQlGSVJTVF9URkRfU0VUIChwX3R4X2Rlc2NfY3VyciwgdHhfcXVldWUpOworCQlwX3R4X2Rlc2NfZmlyc3QgPSBwX3R4X2Rlc2NfY3VycjsKKwl9IGVsc2UgeworCQlGSVJTVF9URkRfR0VUIChwX3R4X2Rlc2NfZmlyc3QsIHR4X3F1ZXVlKTsKKwkJY29tbWFuZF9zdGF0dXMgfD0gRVRIX0JVRkZFUl9PV05FRF9CWV9ETUE7CisJfQorCisJLyogQnVmZmVycyB3aXRoIGEgcGF5bG9hZCBzbWFsbGVyIHRoYW4gOCBieXRlcyBtdXN0IGJlIGFsaWduZWQgdG8gNjQtYml0ICovCisJLyogYm91bmRhcnkuIFdlIHVzZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgVHggZGVzY3JpcHRvci4gVGhpcyBtZW1vcnkgICovCisJLyogbG9jYXRlZCBpbiBUWF9CVUZfT0ZGU0VUX0lOX0RFU0Mgb2Zmc2V0IHdpdGhpbiB0aGUgVHggZGVzY3JpcHRvci4gKi8KKwlpZiAocF9wa3RfaW5mby0+Ynl0ZV9jbnQgPD0gOCkgeworCQlwcmludGYgKCJZb3UgaGF2ZSBmYWlsZWQgaW4gdGhlIDwgOCBieXRlcyBlcnJhdGEgLSBmaXhtZVxuIik7CS8qIFJBQkVFSCAtIFRCRCAqLworCQlyZXR1cm4gRVRIX0VSUk9SOworCisJCXBfdHhfZGVzY19jdXJyLT5idWZfcHRyID0KKwkJCSh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzY19jdXJyICsgVFhfQlVGX09GRlNFVF9JTl9ERVNDOworCQlldGhfYl9jb3B5IChwX3BrdF9pbmZvLT5idWZfcHRyLCBwX3R4X2Rlc2NfY3Vyci0+YnVmX3B0ciwKKwkJCSAgICBwX3BrdF9pbmZvLT5ieXRlX2NudCk7CisJfSBlbHNlCisJCXBfdHhfZGVzY19jdXJyLT5idWZfcHRyID0gcF9wa3RfaW5mby0+YnVmX3B0cjsKKworCXBfdHhfZGVzY19jdXJyLT5ieXRlX2NudCA9IHBfcGt0X2luZm8tPmJ5dGVfY250OworCXBfdHhfZGVzY19jdXJyLT5yZXR1cm5faW5mbyA9IHBfcGt0X2luZm8tPnJldHVybl9pbmZvOworCisJaWYgKHBfcGt0X2luZm8tPmNtZF9zdHMgJiAoRVRIX1RYX0xBU1RfREVTQykpIHsKKwkJLyogU2V0IGxhc3QgZGVzYyB3aXRoIERNQSBvd25lcnNoaXAgYW5kIGludGVycnVwdCBlbmFibGUuICovCisJCXBfdHhfZGVzY19jdXJyLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXMgfAorCQkJRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEgfCBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVDsKKworCQlpZiAocF90eF9kZXNjX2N1cnIgIT0gcF90eF9kZXNjX2ZpcnN0KQorCQkJcF90eF9kZXNjX2ZpcnN0LT5jbWRfc3RzIHw9IEVUSF9CVUZGRVJfT1dORURfQllfRE1BOworCisJCS8qIEZsdXNoIENQVSBwaXBlICovCisKKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2NfY3VyciwgMCk7CisJCURfQ0FDSEVfRkxVU0hfTElORSAoKHVuc2lnbmVkIGludCkgcF90eF9kZXNjX2ZpcnN0LCAwKTsKKwkJQ1BVX1BJUEVfRkxVU0g7CisKKwkJLyogQXBwbHkgc2VuZCBjb21tYW5kICovCisJCUVUSF9FTkFCTEVfVFhfUVVFVUUgKHR4X3F1ZXVlLCBwX2V0aF9wb3J0X2N0cmwtPnBvcnRfbnVtKTsKKworCQkvKiBGaW5pc2ggVHggcGFja2V0LiBVcGRhdGUgZmlyc3QgZGVzYyBpbiBjYXNlIG9mIFR4IHJlc291cmNlIGVycm9yICovCisJCXBfdHhfZGVzY19maXJzdCA9IHBfdHhfbmV4dF9kZXNjX2N1cnI7CisJCUZJUlNUX1RGRF9TRVQgKHBfdHhfZGVzY19maXJzdCwgdHhfcXVldWUpOworCisJfSBlbHNlIHsKKwkJcF90eF9kZXNjX2N1cnItPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1czsKKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2NfY3VyciwgMCk7CisJfQorCisJLyogQ2hlY2sgZm9yIHJpbmcgaW5kZXggb3ZlcmxhcCBpbiB0aGUgVHggZGVzYyByaW5nICovCisJaWYgKHBfdHhfbmV4dF9kZXNjX2N1cnIgPT0gcF90eF9kZXNjX3VzZWQpIHsKKwkJLyogVXBkYXRlIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KKwkJQ1VSUl9URkRfU0VUIChwX3R4X2Rlc2NfZmlyc3QsIHR4X3F1ZXVlKTsKKworCQlwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2Vyclt0eF9xdWV1ZV0gPSB0cnVlOworCQlyZXR1cm4gRVRIX1FVRVVFX0xBU1RfUkVTT1VSQ0U7CisJfSBlbHNlIHsKKwkJLyogVXBkYXRlIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KKwkJQ1VSUl9URkRfU0VUIChwX3R4X25leHRfZGVzY19jdXJyLCB0eF9xdWV1ZSk7CisJCXJldHVybiBFVEhfT0s7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3R4X3JldHVybl9kZXNjIC0gRnJlZSBhbGwgdXNlZCBUeCBkZXNjcmlwdG9ycworICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHRyYW5zbWl0dGVkIHBhY2tldCBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyLgorICogICAgICBJdCB1c2VzIHRoZSAnZmlyc3QnIGluZGV4IHRvIHN1cHBvcnQgVHggZGVzYyByZXR1cm4gaW4gY2FzZSBhIHRyYW5zbWl0CisgKiAgICAgIG9mIGEgcGFja2V0IHNwYW5uZWQgb3ZlciBtdWx0aXBsZSBidWZmZXIgc3RpbGwgaW4gcHJvY2Vzcy4KKyAqICAgICAgSW4gY2FzZSB0aGUgVHggcXVldWUgd2FzIGluICJyZXNvdXJjZSBlcnJvciIgY29uZGl0aW9uLCB3aGVyZSB0aGVyZSBhcmUKKyAqICAgICAgbm8gYXZhaWxhYmxlIFR4IHJlc291cmNlcywgdGhlIGZ1bmN0aW9uIHJlc2V0cyB0aGUgcmVzb3VyY2UgZXJyb3IgZmxhZy4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAl0eF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBUeCBxdWV1ZS4KKyAqCVBLVF9JTkZPICAgICAgICAqcF9wa3RfaW5mbyAgICAgICBVc2VyIHBhY2tldCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJVHggcmluZyAnZmlyc3QnIGFuZCAndXNlZCcgaW5kZXhlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBSRVRVUk46CisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBUeCBkZXNjIHJpbmcuCisgKiAgICAgIEVUSF9SRVRSWSBpbiBjYXNlIHRoZXJlIGlzIHRyYW5zbWlzc2lvbiBpbiBwcm9jZXNzLgorICoJRVRIX0VORF9PRl9KT0IgaWYgdGhlIHJvdXRpbmUgaGFzIG5vdGhpbmcgdG8gcmVsZWFzZS4KKyAqICAgICAgRVRIX09LIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF90eF9yZXR1cm5fZGVzYyAoRVRIX1BPUlRfSU5GTyAqCisJCQkJCSAgICAgICBwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgICBFVEhfUVVFVUUgdHhfcXVldWUsCisJCQkJCSAgICAgICBQS1RfSU5GTyAqIHBfcGt0X2luZm8pCit7CisJdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfZGVzY191c2VkID0gTlVMTDsKKwl2b2xhdGlsZSBFVEhfVFhfREVTQyAqcF90eF9kZXNjX2ZpcnN0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9zdGF0dXM7CisKKworCS8qIEdldCB0aGUgVHggRGVzYyByaW5nIGluZGV4ZXMgKi8KKwlVU0VEX1RGRF9HRVQgKHBfdHhfZGVzY191c2VkLCB0eF9xdWV1ZSk7CisJRklSU1RfVEZEX0dFVCAocF90eF9kZXNjX2ZpcnN0LCB0eF9xdWV1ZSk7CisKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChwX3R4X2Rlc2NfdXNlZCA9PSBOVUxMKQorCQlyZXR1cm4gRVRIX0VSUk9SOworCisJY29tbWFuZF9zdGF0dXMgPSBwX3R4X2Rlc2NfdXNlZC0+Y21kX3N0czsKKworCS8qIFN0aWxsIHRyYW5zbWl0dGluZy4uLiAqLworCWlmIChjb21tYW5kX3N0YXR1cyAmIChFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSkpIHsKKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3R4X2Rlc2NfdXNlZCwgMCk7CisJCXJldHVybiBFVEhfUkVUUlk7CisJfQorCisJLyogU3RvcCByZWxlYXNlLiBBYm91dCB0byBvdmVybGFwIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBUeCBkZXNjcmlwdG9yICovCisJaWYgKChwX3R4X2Rlc2NfdXNlZCA9PSBwX3R4X2Rlc2NfZmlyc3QpICYmCisJICAgIChwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2Vyclt0eF9xdWV1ZV0gPT0gZmFsc2UpKSB7CisJCURfQ0FDSEVfRkxVU0hfTElORSAoKHVuc2lnbmVkIGludCkgcF90eF9kZXNjX3VzZWQsIDApOworCQlyZXR1cm4gRVRIX0VORF9PRl9KT0I7CisJfQorCisJLyogUGFzcyB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIgKi8KKwlwX3BrdF9pbmZvLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXM7CisJcF9wa3RfaW5mby0+cmV0dXJuX2luZm8gPSBwX3R4X2Rlc2NfdXNlZC0+cmV0dXJuX2luZm87CisJcF90eF9kZXNjX3VzZWQtPnJldHVybl9pbmZvID0gMDsKKworCS8qIFVwZGF0ZSB0aGUgbmV4dCBkZXNjcmlwdG9yIHRvIHJlbGVhc2UuICovCisJVVNFRF9URkRfU0VUIChUWF9ORVhUX0RFU0NfUFRSIChwX3R4X2Rlc2NfdXNlZCwgdHhfcXVldWUpLCB0eF9xdWV1ZSk7CisKKwkvKiBBbnkgVHggcmV0dXJuIGNhbmNlbHMgdGhlIFR4IHJlc291cmNlIGVycm9yIHN0YXR1cyAqLworCWlmIChwX2V0aF9wb3J0X2N0cmwtPnR4X3Jlc291cmNlX2Vyclt0eF9xdWV1ZV0gPT0gdHJ1ZSkKKwkJcF9ldGhfcG9ydF9jdHJsLT50eF9yZXNvdXJjZV9lcnJbdHhfcXVldWVdID0gZmFsc2U7CisKKwlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfdHhfZGVzY191c2VkLCAwKTsKKworCXJldHVybiBFVEhfT0s7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3JlY2VpdmUgLSBHZXQgcmVjZWl2ZWQgaW5mb3JtYXRpb24gZnJvbSBSeCByaW5nLgorICoKKyAqIERFU0NSSVBUSU9OOgorICogCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSByZWNlaXZlZCBkYXRhIHRvIHRoZSBjYWxsZXIuIFRoZXJlIGlzIG5vCisgKglkYXRhIGNvcHlpbmcgZHVyaW5nIHJvdXRpbmUgb3BlcmF0aW9uLiBBbGwgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQKKyAqCXVzaW5nIHBvaW50ZXIgdG8gcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdCBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyLgorICogICAgICBJZiB0aGUgcm91dGluZSBleGhhdXN0cwlSeCByaW5nIHJlc291cmNlcyB0aGVuIHRoZSByZXNvdXJjZSBlcnJvciBmbGFnCisgKiAgICAgIGlzIHNldC4KKyAqCisgKiBJTlBVVDoKKyAqCUVUSF9QT1JUX0lORk8gICAqcF9ldGhfcG9ydF9jdHJsICAgRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCUVUSF9RVUVVRSAgIAlyeF9xdWV1ZSAgICAgICAgIE51bWJlciBvZiBSeCBxdWV1ZS4KKyAqCVBLVF9JTkZPICAgICAgICAqcF9wa3RfaW5mbyAgICAgICBVc2VyIHBhY2tldCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJUnggcmluZyBjdXJyZW50IGFuZCB1c2VkIGluZGV4ZXMgYXJlIHVwZGF0ZWQuCisgKgorICogUkVUVVJOOgorICoJRVRIX0VSUk9SIGluIGNhc2UgdGhlIHJvdXRpbmUgY2FuIG5vdCBhY2Nlc3MgUnggZGVzYyByaW5nLgorICoJRVRIX1FVRVVFX0ZVTEwgaWYgUnggcmluZyByZXNvdXJjZXMgYXJlIGV4aGF1c3RlZC4KKyAqCUVUSF9FTkRfT0ZfSk9CIGlmIHRoZXJlIGlzIG5vIHJlY2VpdmVkIGRhdGEuCisgKiAgICAgIEVUSF9PSyBvdGhlcndpc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9yZWNlaXZlIChFVEhfUE9SVF9JTkZPICogcF9ldGhfcG9ydF9jdHJsLAorCQkJCQkgICAgIEVUSF9RVUVVRSByeF9xdWV1ZSwKKwkJCQkJICAgICBQS1RfSU5GTyAqIHBfcGt0X2luZm8pCit7CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfcnhfY3Vycl9kZXNjOworCXZvbGF0aWxlIEVUSF9SWF9ERVNDICpwX3J4X25leHRfY3Vycl9kZXNjOworCXZvbGF0aWxlIEVUSF9SWF9ERVNDICpwX3J4X3VzZWRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZF9zdGF0dXM7CisKKwkvKiBEbyBub3QgcHJvY2VzcyBSeCByaW5nIGluIGNhc2Ugb2YgUnggcmluZyByZXNvdXJjZSBlcnJvciAqLworCWlmIChwX2V0aF9wb3J0X2N0cmwtPnJ4X3Jlc291cmNlX2VycltyeF9xdWV1ZV0gPT0gdHJ1ZSkgeworCQlwcmludGYgKCJcblJ4IFF1ZXVlIGlzIGZ1bGwgLi4uXG4iKTsKKwkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOworCX0KKworCS8qIEdldCB0aGUgUnggRGVzYyByaW5nICdjdXJyIGFuZCAndXNlZCcgaW5kZXhlcyAqLworCUNVUlJfUkZEX0dFVCAocF9yeF9jdXJyX2Rlc2MsIHJ4X3F1ZXVlKTsKKwlVU0VEX1JGRF9HRVQgKHBfcnhfdXNlZF9kZXNjLCByeF9xdWV1ZSk7CisKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAocF9yeF9jdXJyX2Rlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIEVUSF9FUlJPUjsKKworCS8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBzYXZlIHJlYWRpbmdzIGZyb20gbWVtb3J5ICovCisJcF9yeF9uZXh0X2N1cnJfZGVzYyA9IFJYX05FWFRfREVTQ19QVFIgKHBfcnhfY3Vycl9kZXNjLCByeF9xdWV1ZSk7CisJY29tbWFuZF9zdGF0dXMgPSBwX3J4X2N1cnJfZGVzYy0+Y21kX3N0czsKKworCS8qIE5vdGhpbmcgdG8gcmVjZWl2ZS4uLiAqLworCWlmIChjb21tYW5kX3N0YXR1cyAmIChFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSkpIHsKKy8qIAlEUChwcmludGYoIlJ4OiBjb21tYW5kX3N0YXR1czogJTA4eFxuIiwgY29tbWFuZF9zdGF0dXMpKTsgKi8KKwkJRF9DQUNIRV9GTFVTSF9MSU5FICgodW5zaWduZWQgaW50KSBwX3J4X2N1cnJfZGVzYywgMCk7CisvKglEUChwcmludGYoIlxuRVRIX0VORF9PRl9KT0IgLi4uXG4iKSk7Ki8KKwkJcmV0dXJuIEVUSF9FTkRfT0ZfSk9COworCX0KKworCXBfcGt0X2luZm8tPmJ5dGVfY250ID0gKHBfcnhfY3Vycl9kZXNjLT5ieXRlX2NudCkgLSBSWF9CVUZfT0ZGU0VUOworCXBfcGt0X2luZm8tPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1czsKKwlwX3BrdF9pbmZvLT5idWZfcHRyID0gKHBfcnhfY3Vycl9kZXNjLT5idWZfcHRyKSArIFJYX0JVRl9PRkZTRVQ7CisJcF9wa3RfaW5mby0+cmV0dXJuX2luZm8gPSBwX3J4X2N1cnJfZGVzYy0+cmV0dXJuX2luZm87CisJcF9wa3RfaW5mby0+bDRpX2NoayA9IHBfcnhfY3Vycl9kZXNjLT5idWZfc2l6ZTsJLyogSVAgZnJhZ21lbnQgaW5kaWNhdG9yICovCisKKwkvKiBDbGVhbiB0aGUgcmV0dXJuIGluZm8gZmllbGQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGFja2V0IGhhcyBiZWVuICovCisJLyogbW92ZWQgdG8gdGhlIHVwcGVyIGxheWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXBfcnhfY3Vycl9kZXNjLT5yZXR1cm5faW5mbyA9IDA7CisKKwkvKiBVcGRhdGUgJ2N1cnInIGluIGRhdGEgc3RydWN0dXJlICovCisJQ1VSUl9SRkRfU0VUIChwX3J4X25leHRfY3Vycl9kZXNjLCByeF9xdWV1ZSk7CisKKwkvKiBSeCBkZXNjcmlwdG9ycyByZXNvdXJjZSBleGhhdXN0ZWQuIFNldCB0aGUgUnggcmluZyByZXNvdXJjZSBlcnJvciBmbGFnICovCisJaWYgKHBfcnhfbmV4dF9jdXJyX2Rlc2MgPT0gcF9yeF91c2VkX2Rlc2MpCisJCXBfZXRoX3BvcnRfY3RybC0+cnhfcmVzb3VyY2VfZXJyW3J4X3F1ZXVlXSA9IHRydWU7CisKKwlEX0NBQ0hFX0ZMVVNIX0xJTkUgKCh1bnNpZ25lZCBpbnQpIHBfcnhfY3Vycl9kZXNjLCAwKTsKKwlDUFVfUElQRV9GTFVTSDsKKwlyZXR1cm4gRVRIX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXRoX3J4X3JldHVybl9idWZmIC0gUmV0dXJucyBhIFJ4IGJ1ZmZlciBiYWNrIHRvIHRoZSBSeCByaW5nLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHJldHVybnMgYSBSeCBidWZmZXIgYmFjayB0byB0aGUgUnggcmluZy4gSXQgcmV0cmlldmVzIHRoZQorICogICAgICBuZXh0ICd1c2VkJyBkZXNjcmlwdG9yIGFuZCBhdHRhY2hlZCB0aGUgcmV0dXJuZWQgYnVmZmVyIHRvIGl0LgorICogICAgICBJbiBjYXNlIHRoZSBSeCByaW5nIHdhcyBpbiAicmVzb3VyY2UgZXJyb3IiIGNvbmRpdGlvbiwgd2hlcmUgdGhlcmUgYXJlCisgKiAgICAgIG5vIGF2YWlsYWJsZSBSeCByZXNvdXJjZXMsIHRoZSBmdW5jdGlvbiByZXNldHMgdGhlIHJlc291cmNlIGVycm9yIGZsYWcuCisgKgorICogSU5QVVQ6CisgKglFVEhfUE9SVF9JTkZPICAgKnBfZXRoX3BvcnRfY3RybCAgIEV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKglFVEhfUVVFVUUgICAJcnhfcXVldWUgICAgICAgICBOdW1iZXIgb2YgUnggcXVldWUuCisgKiAgICAgIFBLVF9JTkZPICAgICAgICAqcF9wa3RfaW5mbyAgICAgICBJbmZvcm1hdGlvbiBvbiB0aGUgcmV0dXJuZWQgYnVmZmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCU5ldyBhdmFpbGFibGUgUnggcmVzb3VyY2UgaW4gUnggZGVzY3JpcHRvciByaW5nLgorICoKKyAqIFJFVFVSTjoKKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFJ4IGRlc2MgcmluZy4KKyAqICAgICAgRVRIX09LIG90aGVyd2lzZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9yeF9yZXR1cm5fYnVmZiAoRVRIX1BPUlRfSU5GTyAqCisJCQkJCSAgICAgICBwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgICBFVEhfUVVFVUUgcnhfcXVldWUsCisJCQkJCSAgICAgICBQS1RfSU5GTyAqIHBfcGt0X2luZm8pCit7CisJdm9sYXRpbGUgRVRIX1JYX0RFU0MgKnBfdXNlZF9yeF9kZXNjOwkvKiBXaGVyZSB0byByZXR1cm4gUnggcmVzb3VyY2UgKi8KKworCS8qIEdldCAndXNlZCcgUnggZGVzY3JpcHRvciAqLworCVVTRURfUkZEX0dFVCAocF91c2VkX3J4X2Rlc2MsIHJ4X3F1ZXVlKTsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChwX3VzZWRfcnhfZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gRVRIX0VSUk9SOworCisJcF91c2VkX3J4X2Rlc2MtPmJ1Zl9wdHIgPSBwX3BrdF9pbmZvLT5idWZfcHRyOworCXBfdXNlZF9yeF9kZXNjLT5yZXR1cm5faW5mbyA9IHBfcGt0X2luZm8tPnJldHVybl9pbmZvOworCXBfdXNlZF9yeF9kZXNjLT5ieXRlX2NudCA9IHBfcGt0X2luZm8tPmJ5dGVfY250OworCXBfdXNlZF9yeF9kZXNjLT5idWZfc2l6ZSA9IE1WNjQ0NjBfUlhfQlVGRkVSX1NJWkU7CS8qIFJlc2V0IEJ1ZmZlciBzaXplICovCisKKwkvKiBGbHVzaCB0aGUgd3JpdGUgcGlwZSAqLworCUNQVV9QSVBFX0ZMVVNIOworCisJLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9yIHRvIERNQSBvd25lcnNoaXAgKi8KKwlwX3VzZWRfcnhfZGVzYy0+Y21kX3N0cyA9CisJCUVUSF9CVUZGRVJfT1dORURfQllfRE1BIHwgRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQ7CisKKwkvKiBGbHVzaCBkZXNjcmlwdG9yIGFuZCBDUFUgcGlwZSAqLworCURfQ0FDSEVfRkxVU0hfTElORSAoKHVuc2lnbmVkIGludCkgcF91c2VkX3J4X2Rlc2MsIDApOworCUNQVV9QSVBFX0ZMVVNIOworCisJLyogTW92ZSB0aGUgdXNlZCBkZXNjcmlwdG9yIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvciAqLworCVVTRURfUkZEX1NFVCAoUlhfTkVYVF9ERVNDX1BUUiAocF91c2VkX3J4X2Rlc2MsIHJ4X3F1ZXVlKSwgcnhfcXVldWUpOworCisJLyogQW55IFJ4IHJldHVybiBjYW5jZWxzIHRoZSBSeCByZXNvdXJjZSBlcnJvciBzdGF0dXMgKi8KKwlpZiAocF9ldGhfcG9ydF9jdHJsLT5yeF9yZXNvdXJjZV9lcnJbcnhfcXVldWVdID09IHRydWUpCisJCXBfZXRoX3BvcnRfY3RybC0+cnhfcmVzb3VyY2VfZXJyW3J4X3F1ZXVlXSA9IGZhbHNlOworCisJcmV0dXJuIEVUSF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV0aF9wb3J0X3NldF9yeF9jb2FsIC0gU2V0cyBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gb24gUlggcGF0aAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIFJYIGNvYWxlc2NpbmcgaW50ZXJydXB0IG1lY2hhbmlzbSBwYXJhbWV0ZXIuCisgKglUaGlzIHBhcmFtZXRlciBpcyBhIHRpbWVvdXQgY291bnRlciwgdGhhdCBjb3VudHMgaW4gNjQgdF9jbGsKKyAqCWNodW5rcyA7IHRoYXQgd2hlbiB0aW1lb3V0IGV2ZW50IG9jY3VycyBhIG1hc2thYmxlIGludGVycnVwdAorICoJb2NjdXJzLgorICoJVGhlIHBhcmFtZXRlciBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSB0Q2xrIG9mIHRoZSBNVi02NDN4eCBjaGlwCisgKgksIGFuZCB0aGUgcmVxdWlyZWQgZGVsYXkgb2YgdGhlIGludGVycnVwdCBpbiB1c2VjLgorICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgZXRoX3BvcnRfbnVtICAgICAgRXRoZXJuZXQgcG9ydCBudW1iZXIKKyAqCXVuc2lnbmVkIGludCB0X2NsayAgICAgICAgdF9jbGsgb2YgdGhlIE1WLTY0M3h4IGNoaXAgaW4gSFogdW5pdHMKKyAqCXVuc2lnbmVkIGludCBkZWxheSAgICAgICBEZWxheSBpbiB1c2VjCisgKgorICogT1VUUFVUOgorICoJSW50ZXJydXB0IGNvYWxlc2NpbmcgbWVjaGFuaXNtIHZhbHVlIGlzIHNldCBpbiBNVi02NDN4eCBjaGlwLgorICoKKyAqIFJFVFVSTjoKKyAqCVRoZSBpbnRlcnJ1cHQgY29hbGVzY2luZyB2YWx1ZSBzZXQgaW4gdGhlIGdpZ0UgcG9ydC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwCQkJCS8qIEZJWE1FICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aF9wb3J0X3NldF9yeF9jb2FsIChFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJCSAgdW5zaWduZWQgaW50IHRfY2xrLAorCQkJCQkgIHVuc2lnbmVkIGludCBkZWxheSkKK3sKKwl1bnNpZ25lZCBpbnQgY29hbDsKKworCWNvYWwgPSAoKHRfY2xrIC8gMTAwMDAwMCkgKiBkZWxheSkgLyA2NDsKKwkvKiBTZXQgUlggQ29hbGVzY2luZyBtZWNoYW5pc20gKi8KKwlNVl9SRUdfV1JJVEUgKE1WNjQ0NjBfRVRIX1NETUFfQ09ORklHX1JFRyAoZXRoX3BvcnRfbnVtKSwKKwkJICAgICAgKChjb2FsICYgMHgzZmZmKSA8PCA4KSB8CisJCSAgICAgIChNVl9SRUdfUkVBRAorCQkgICAgICAgKE1WNjQ0NjBfRVRIX1NETUFfQ09ORklHX1JFRyAoZXRoX3BvcnRfbnVtKSkKKwkJICAgICAgICYgMHhmZmMwMDBmZikpOworCXJldHVybiBjb2FsOworfQorCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhfcG9ydF9zZXRfdHhfY29hbCAtIFNldHMgY29hbGVzY2luZyBpbnRlcnJ1cHQgbWVjaGFuaXNtIG9uIFRYIHBhdGgKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHRoZSBUWCBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gcGFyYW1ldGVyLgorICoJVGhpcyBwYXJhbWV0ZXIgaXMgYSB0aW1lb3V0IGNvdW50ZXIsIHRoYXQgY291bnRzIGluIDY0IHRfY2xrCisgKgljaHVua3MgOyB0aGF0IHdoZW4gdGltZW91dCBldmVudCBvY2N1cnMgYSBtYXNrYWJsZSBpbnRlcnJ1cHQKKyAqCW9jY3Vycy4KKyAqCVRoZSBwYXJhbWV0ZXIgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgdF9jTEsgZnJlcXVlbmN5IG9mIHRoZQorICoJTVYtNjQzeHggY2hpcCBhbmQgdGhlIHJlcXVpcmVkIGRlbGF5IGluIHRoZSBpbnRlcnJ1cHQgaW4gdVNlYworICoKKyAqIElOUFVUOgorICoJRVRIX1BPUlQgZXRoX3BvcnRfbnVtICAgICAgRXRoZXJuZXQgcG9ydCBudW1iZXIKKyAqCXVuc2lnbmVkIGludCB0X2NsayAgICAgICAgdF9jbGsgb2YgdGhlIE1WLTY0M3h4IGNoaXAgaW4gSFogdW5pdHMKKyAqCXVuc2lnbmVkIGludCBkZWxheSAgICAgICBEZWxheSBpbiB1U2Vjb25kcworICoKKyAqIE9VVFBVVDoKKyAqCUludGVycnVwdCBjb2FsZXNjaW5nIG1lY2hhbmlzbSB2YWx1ZSBpcyBzZXQgaW4gTVYtNjQzeHggY2hpcC4KKyAqCisgKiBSRVRVUk46CisgKglUaGUgaW50ZXJydXB0IGNvYWxlc2NpbmcgdmFsdWUgc2V0IGluIHRoZSBnaWdFIHBvcnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgMAkJCQkvKiBGSVhNRSAqLworc3RhdGljIHVuc2lnbmVkIGludCBldGhfcG9ydF9zZXRfdHhfY29hbCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCQkgIHVuc2lnbmVkIGludCB0X2NsaywKKwkJCQkJICB1bnNpZ25lZCBpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgaW50IGNvYWw7CisKKwljb2FsID0gKCh0X2NsayAvIDEwMDAwMDApICogZGVsYXkpIC8gNjQ7CisJLyogU2V0IFRYIENvYWxlc2NpbmcgbWVjaGFuaXNtICovCisJTVZfUkVHX1dSSVRFIChNVjY0NDYwX0VUSF9UWF9GSUZPX1VSR0VOVF9USFJFU0hPTERfUkVHIChldGhfcG9ydF9udW0pLAorCQkgICAgICBjb2FsIDw8IDQpOworCXJldHVybiBjb2FsOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldGhfYl9jb3B5IC0gQ29weSBieXRlcyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOgorICogICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyB0aGUgZWlnaHQgYnl0ZXMgbGltaXRhdGlvbiBvbiBUeCBidWZmZXIgc2l6ZS4KKyAqICAgICAgIFRoZSByb3V0aW5lIHdpbGwgemVybyBlaWdodCBieXRlcyBzdGFydGluZyBmcm9tIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiAgICAgICBmb2xsb3dlZCBieSBjb3B5aW5nIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBhZGRyZXNzIHRvIHRoZSBkZXN0aW5hdGlvbi4KKyAqCisgKiBJTlBVVDoKKyAqICAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkciAgICAzMiBiaXQgc291cmNlIGFkZHJlc3MuCisgKiAgICAgICB1bnNpZ25lZCBpbnQgZHN0X2FkZHIgICAgMzIgYml0IGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKiAgICAgICBpbnQgICAgICAgIGJ5dGVfY291bnQgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKgorICogT1VUUFVUOgorICogICAgICAgU2VlIGRlc2NyaXB0aW9uLgorICoKKyAqIFJFVFVSTjoKKyAqICAgICAgIE5vbmUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBldGhfYl9jb3B5ICh1bnNpZ25lZCBpbnQgc3JjX2FkZHIsIHVuc2lnbmVkIGludCBkc3RfYWRkciwKKwkJCWludCBieXRlX2NvdW50KQoreworCS8qIFplcm8gdGhlIGRzdF9hZGRyIGFyZWEgKi8KKwkqKHVuc2lnbmVkIGludCAqKSBkc3RfYWRkciA9IDB4MDsKKworCXdoaWxlIChieXRlX2NvdW50ICE9IDApIHsKKwkJKihjaGFyICopIGRzdF9hZGRyID0gKihjaGFyICopIHNyY19hZGRyOworCQlkc3RfYWRkcisrOworCQlzcmNfYWRkcisrOworCQlieXRlX2NvdW50LS07CisJfQorfQpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0NDYwL212X2V0aC5oIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL212X2V0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTQ5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvbXZfZXRoLmgKQEAgLTAsMCArMSw4NDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMKKyAqIEluZ28gQXNzbXVzIDxpbmdvLmFzc211c0BrZXltaWxlLmNvbT4KKyAqCisgKiBiYXNlZCBvbiAtIERyaXZlciBmb3IgTVY2NDQ2MFggZXRoZXJuZXQgcG9ydHMKKyAqIENvcHlyaWdodCAoQykgMjAwMiByYWJlZWhAZ2FsaWxlby5jby5pbAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBtdl9ldGguaCAtIGhlYWRlciBmaWxlIGZvciB0aGUgcG9sbGVkIG1vZGUgR1QgZXRoZXJuZXQgZHJpdmVyCisgKi8KKworI2lmbmRlZiBfX0RCNjQ0NjBfRVRIX0hfXworI2RlZmluZSBfX0RCNjQ0NjBfRVRIX0hfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgIm12X3JlZ3MuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vcHBjX2Vycm9yX25vLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgVGhlIGZpcnN0IHBhcnQgaXMgdGhlIGhpZ2ggbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisvKiBJbiBjYXNlIG5vdCB1c2luZyBTRyBvbiBUeCwgZGVmaW5lIE1BWF9TS0JfRlJBR1MgYXMgMCAqLworI2lmbmRlZiBNQVhfU0tCX0ZSQUdTCisjZGVmaW5lIE1BWF9TS0JfRlJBR1MgMAorI2VuZGlmCisKKy8qIFBvcnQgYXR0cmlidXRlcyAqLworLyojZGVmaW5lIE1BWF9SWF9RVUVVRV9OVU0JOCovCisvKiNkZWZpbmUgTUFYX1RYX1FVRVVFX05VTQk4Ki8KKyNkZWZpbmUgTUFYX1JYX1FVRVVFX05VTQkxCisjZGVmaW5lIE1BWF9UWF9RVUVVRV9OVU0JMQorCisKKy8qIFVzZSBvbmUgVFggcXVldWUgYW5kIG9uZSBSWCBxdWV1ZSAqLworI2RlZmluZSBNVjY0NDYwX1RYX1FVRVVFX05VTSAxCisjZGVmaW5lIE1WNjQ0NjBfUlhfUVVFVUVfTlVNIDEKKworLyoKKyAqIE51bWJlciBvZiBSWCAvIFRYIGRlc2NyaXB0b3JzIG9uIFJYIC8gVFggcmluZ3MuCisgKiBOb3RlIHRoYXQgYWxsb2NhdGluZyBSWCBkZXNjcmlwdG9ycyBpcyBkb25lIGJ5IGFsbG9jYXRpbmcgdGhlIFJYCisgKiByaW5nIEFORCBhIHByZWFsbG9jYXRlZCBSWCBidWZmZXJzIChza2IncykgZm9yIGVhY2ggZGVzY3JpcHRvci4KKyAqIFRoZSBUWCBkZXNjcmlwdG9ycyBvbmx5IGFsbG9jYXRlcyB0aGUgVFggZGVzY3JpcHRvcnMgcmluZywKKyAqIHdpdGggbm8gcHJlIGFsbG9jYXRlZCBUWCBidWZmZXJzIChza2IncyBhcmUgYWxsb2NhdGVkIGJ5IGhpZ2hlciBsYXllcnMuCisgKi8KKworLyogRGVmYXVsdCBUWCByaW5nIHNpemUgaXMgMTAgZGVzY3JpcHRvcnMgKi8KKyNpZmRlZiBDT05GSUdfTVY2NDQ2MF9FVEhfVFhRVUVVRV9TSVpFCisjZGVmaW5lIE1WNjQ0NjBfVFhfUVVFVUVfU0laRSBDT05GSUdfTVY2NDQ2MF9FVEhfVFhRVUVVRV9TSVpFCisjZWxzZQorI2RlZmluZSBNVjY0NDYwX1RYX1FVRVVFX1NJWkUgNAorI2VuZGlmCisKKy8qIERlZmF1bHQgUlggcmluZyBzaXplIGlzIDQgZGVzY3JpcHRvcnMgKi8KKyNpZmRlZglDT05GSUdfTVY2NDQ2MF9FVEhfUlhRVUVVRV9TSVpFCisjZGVmaW5lIE1WNjQ0NjBfUlhfUVVFVUVfU0laRSBDT05GSUdfTVY2NDQ2MF9FVEhfUlhRVUVVRV9TSVpFCisjZWxzZQorI2RlZmluZSBNVjY0NDYwX1JYX1FVRVVFX1NJWkUgNAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlhfQlVGRkVSX1NJWkUKKyNkZWZpbmUgTVY2NDQ2MF9SWF9CVUZGRVJfU0laRSBDT05GSUdfUlhfQlVGRkVSX1NJWkUKKyNlbHNlCisjZGVmaW5lIE1WNjQ0NjBfUlhfQlVGRkVSX1NJWkUgMTYwMAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVFhfQlVGRkVSX1NJWkUKKyNkZWZpbmUgTVY2NDQ2MF9UWF9CVUZGRVJfU0laRSBDT05GSUdfVFhfQlVGRkVSX1NJWkUKKyNlbHNlCisjZGVmaW5lIE1WNjQ0NjBfVFhfQlVGRkVSX1NJWkUgMTYwMAorI2VuZGlmCisKKy8qCisgKglOZXR3b3JrIGRldmljZSBzdGF0aXN0aWNzLiBBa2luIHRvIHRoZSAyLjAgZXRoZXIgc3RhdHMgYnV0CisgKgl3aXRoIGJ5dGUgY291bnRlcnMuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMKK3sKKwl1bnNpZ25lZCBsb25nCXJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkCSovCisJdW5zaWduZWQgbG9uZwl0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZAkqLworCXVuc2lnbmVkIGxvbmcJcnhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyByZWNlaXZlZAkJKi8KKwl1bnNpZ25lZCBsb25nCXR4X2J5dGVzOwkJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2Vycm9yczsJCS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkCQkqLworCXVuc2lnbmVkIGxvbmcJdHhfZXJyb3JzOwkJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zCSovCisJdW5zaWduZWQgbG9uZwlyeF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgaW4gbGludXggYnVmZmVycwkqLworCXVuc2lnbmVkIGxvbmcJdHhfZHJvcHBlZDsJCS8qIG5vIHNwYWNlIGF2YWlsYWJsZSBpbiBsaW51eAkqLworCXVuc2lnbmVkIGxvbmcJbXVsdGljYXN0OwkJLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQJKi8KKwl1bnNpZ25lZCBsb25nCWNvbGxpc2lvbnM7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJdW5zaWduZWQgbG9uZwlyeF9sZW5ndGhfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJcnhfb3Zlcl9lcnJvcnM7CQkvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2NyY19lcnJvcnM7CQkvKiByZWN2ZWQgcGt0IHdpdGggY3JjIGVycm9yCSovCisJdW5zaWduZWQgbG9uZwlyeF9mcmFtZV9lcnJvcnM7CS8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwl1bnNpZ25lZCBsb25nCXJ4X2ZpZm9fZXJyb3JzOwkJLyogcmVjdidyIGZpZm8gb3ZlcnJ1bgkJKi8KKwl1bnNpZ25lZCBsb25nCXJ4X21pc3NlZF9lcnJvcnM7CS8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQJKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworCXVuc2lnbmVkIGxvbmcJdHhfYWJvcnRlZF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZwl0eF9jYXJyaWVyX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXR4X2ZpZm9fZXJyb3JzOworCXVuc2lnbmVkIGxvbmcJdHhfaGVhcnRiZWF0X2Vycm9yczsKKwl1bnNpZ25lZCBsb25nCXR4X3dpbmRvd19lcnJvcnM7CisKKwkvKiBmb3IgY3NsaXAgZXRjICovCisJdW5zaWduZWQgbG9uZwlyeF9jb21wcmVzc2VkOworCXVuc2lnbmVkIGxvbmcJdHhfY29tcHJlc3NlZDsKK307CisKKworLyogUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIGZvciBldGhlcm5ldCBkZXZpY2UgKi8KK3N0cnVjdCBtdjY0NDYwX2V0aF9wcml2IHsKKyAgICB1bnNpZ25lZCBpbnQgcG9ydF9udW07CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisvKiB0byBidWZmZXIgYXJlYSBhbGlnbmVkICovCisgICAgY2hhciAqIHBfZXRoX3R4X2J1ZmZlcltNVjY0NDYwX1RYX1FVRVVFX1NJWkUrMV07CS8qcG9pbnRlcnMgdG8gYWxsaWduZWQgdHggYnVmZnMgaW4gbWVtb3J5IHNwYWNlICovCisgICAgY2hhciAqIHBfZXRoX3J4X2J1ZmZlcltNVjY0NDYwX1JYX1FVRVVFX1NJWkUrMV07CS8qcG9pbnRlcnMgdG8gYWxsaW5nZWQgcnggYnVmZnMgaW4gbWVtb3J5IHNwYWNlICovCisKKyAgICAvKiBTaXplIG9mIFR4IFJpbmcgcGVyIHF1ZXVlICovCisgICAgdW5zaWduZWQgaW50IHR4X3Jpbmdfc2l6ZSBbTUFYX1RYX1FVRVVFX05VTV07CisKKworICAgIC8qIFNpemUgb2YgUnggUmluZyBwZXIgcXVldWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgcnhfcmluZ19zaXplIFtNQVhfUlhfUVVFVUVfTlVNXTsKKworICAgIC8qIE1hZ2ljIE51bWJlciBmb3IgRXRoZXJuZXQgcnVubmluZyAqLworICAgIHVuc2lnbmVkIGludCBldGhfcnVubmluZzsKKworfTsKKworaW50IG12NjQ0NjBfZXRoX2luaXQgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworaW50IG12NjQ0NjBfZXRoX3N0b3AgKHN0cnVjdCBldGhfZGV2aWNlICpkZXYpOworaW50IG12NjQ0NjBfZXRoX3N0YXJ0X3htaXQgKHN0cnVjdCBldGhfZGV2aWNlKiwgdm9sYXRpbGUgdm9pZCogcGFja2V0LCBpbnQgbGVuZ3RoKTsKKy8qCXJldHVybiBkYjY0NDYwX2V0aDBfcG9sbCgpOyAqLworCitpbnQgbXY2NDQ2MF9ldGhfb3BlbiAoc3RydWN0IGV0aF9kZXZpY2UgKmRldik7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgVGhlIHNlY29uZCBwYXJ0IGlzIHRoZSBsb3cgbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgkgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVhZGVyIEZpbGUgZm9yIDogTVYtNjQzeHggbmV0d29yayBpbnRlcmZhY2UgaGVhZGVyCisgKgorICogREVTQ1JJUFRJT046CisgKgkgVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBtYWNyb3MgdHlwZWRlZnMgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvcgorICoJIHRoZSBNYXJ2ZWxsIEdpZyBCaXQgRXRoZXJuZXQgQ29udHJvbGxlci4KKyAqCisgKiBERVBFTkRFTkNJRVM6CisgKgkgTm9uZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgQ09ORklHX1NQRUNJQUxfQ09OU0lTVEVOVF9NRU1PUlkKKyNpZmRlZiBDT05GSUdfTVY2NDQ2MF9TUkFNX0NBQ0hFQUJMRQorLyogSW4gY2FzZSBTUkFNIGlzIGNhY2hlYWJsZSBidXQgbm90IGNhY2hlIGNvaGVyZW50ICovCisjZGVmaW5lIERfQ0FDSEVfRkxVU0hfTElORShhZGRyLCBvZmZzZXQpICAgICAgIFwKK3sJCSAgICBcCisgIF9fYXNtX18gX192b2xhdGlsZV9fICgiZGNiZiAlMCwlMSIgOiA6ICJyIiAoYWRkciksICJyIiAob2Zmc2V0KSk7IFwKK30KKyNlbHNlCisvKiBJbiBjYXNlIFNSQU0gaXMgY2FjaGUgY29oZXJlbnQgb3Igbm9uLWNhY2hlYWJsZSAqLworI2RlZmluZSBEX0NBQ0hFX0ZMVVNIX0xJTkUoYWRkciwgb2Zmc2V0KSA7CisjZW5kaWYKKyNlbHNlCisjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorLyogSW4gY2FzZSBvZiBkZXNjcmlwdG9ycyBvbiBERFIgYnV0IG5vdCBjYWNoZSBjb2hlcmVudCAqLworI2RlZmluZSBEX0NBQ0hFX0ZMVVNIX0xJTkUoYWRkciwgb2Zmc2V0KSAgICAgICBcCit7CQkgICAgXAorICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImRjYmYgJTAsJTEiIDogOiAiciIgKGFkZHIpLCAiciIgKG9mZnNldCkpOyBcCit9CisjZWxzZQorLyogSW4gY2FzZSBvZiBkZXNjcmlwdG9ycyBvbiBERFIgYW5kIGNhY2hlIGNvaGVyZW50ICovCisjZGVmaW5lIERfQ0FDSEVfRkxVU0hfTElORShhZGRyLCBvZmZzZXQpIDsKKyNlbmRpZiAvKiBDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFICovCisjZW5kaWYgLyogQ09ORklHX1NQRUNJQUxfQ09OU0lTVEVOVF9NRU1PUlkgKi8KKworCisjZGVmaW5lIENQVV9QSVBFX0ZMVVNICQkgICBcCit7CQkgIFwKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOwkgIFwKK30KKworCisvKiBkZWZpbmVzICAqLworCisvKiBEZWZhdWx0IHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZSAqLworI2RlZmluZSBQT1JUX0NPTkZJR19WQUxVRQkJCVwKKwkgICAgIEVUSF9VTklDQVNUX05PUk1BTF9NT0RFCQl8ICAgXAorCSAgICAgRVRIX0RFRkFVTFRfUlhfUVVFVUVfMAkJfCAgIFwKKwkgICAgIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV8wCQl8ICAgXAorCSAgICAgRVRIX1JFQ0VJVkVfQkNfSUZfTk9UX0lQX09SX0FSUAl8ICAgXAorCSAgICAgRVRIX1JFQ0VJVkVfQkNfSUZfSVAJCXwgICBcCisJICAgICBFVEhfUkVDRUlWRV9CQ19JRl9BUlAJCXwgICBcCisJICAgICBFVEhfQ0FQVFVSRV9UQ1BfRlJBTUVTX0RJUwkJfCAgIFwKKwkgICAgIEVUSF9DQVBUVVJFX1VEUF9GUkFNRVNfRElTCQl8ICAgXAorCSAgICAgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzAJCXwgICBcCisJICAgICBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMAkJfCAgIFwKKwkgICAgIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMAorCisvKiBEZWZhdWx0IHBvcnQgZXh0ZW5kIGNvbmZpZ3VyYXRpb24gdmFsdWUgKi8KKyNkZWZpbmUgUE9SVF9DT05GSUdfRVhURU5EX1ZBTFVFCQlcCisJICAgICBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfQVNfTk9STUFMCXwgICBcCisJICAgICBFVEhfUEFSVElUSU9OX0RJU0FCTEUKKworCisvKiBEZWZhdWx0IHNkbWEgY29udHJvbCB2YWx1ZSAqLworI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKyNkZWZpbmUgUE9SVF9TRE1BX0NPTkZJR19WQUxVRQkJCQlcCisJCQkgRVRIX1JYX0JVUlNUX1NJWkVfMTZfNjRCSVQJfAlcCisJCQkgR1RfRVRIX0lQR19JTlRfUlgoMCkJCQl8CVwKKwkJCSBFVEhfVFhfQlVSU1RfU0laRV8xNl82NEJJVDsKKyNlbHNlCisjZGVmaW5lIFBPUlRfU0RNQV9DT05GSUdfVkFMVUUJCQlcCisJCQkgRVRIX1JYX0JVUlNUX1NJWkVfNF82NEJJVAl8CVwKKwkJCSBHVF9FVEhfSVBHX0lOVF9SWCgwKQkJCXwJXAorCQkJIEVUSF9UWF9CVVJTVF9TSVpFXzRfNjRCSVQ7CisjZW5kaWYKKworI2RlZmluZSBHVF9FVEhfSVBHX0lOVF9SWCh2YWx1ZSkJCVwKKwkgICAgKCh2YWx1ZSAmIDB4M2ZmZikgPDwgOCkKKworLyogRGVmYXVsdCBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlICovCisjZGVmaW5lIFBPUlRfU0VSSUFMX0NPTlRST0xfVkFMVUUJCQkgICAgXAorCQkJRVRIX0ZPUkNFX0xJTktfUEFTUwkJCXwJXAorCQkJRVRIX0VOQUJMRV9BVVRPX05FR19GT1JfRFVQTFgJCXwJXAorCQkJRVRIX0RJU0FCTEVfQVVUT19ORUdfRk9SX0ZMT1dfQ1RSTAl8CVwKKwkJCUVUSF9BRFZfU1lNTUVUUklDX0ZMT1dfQ1RSTAkJfAlcCisJCQlFVEhfRk9SQ0VfRkNfTU9ERV9OT19QQVVTRV9ESVNfVFgJfAlcCisJCQlFVEhfRk9SQ0VfQlBfTU9ERV9OT19KQU0JCXwJXAorCQkJQklUOQkJCQkJfAlcCisJCQlFVEhfRE9fTk9UX0ZPUkNFX0xJTktfRkFJTAkJfAlcCisJCQlFVEhfUkVUUkFOU01JVF8xNl9FVFRFTVBUUwkJfAlcCisJCQlFVEhfRU5BQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkJCXwJXAorCQkJRVRIX0RURV9BRFZfMAkJCQl8CVwKKwkJCUVUSF9ESVNBQkxFX0FVVE9fTkVHX0JZUEFTUwkJfAlcCisJCQlFVEhfQVVUT19ORUdfTk9fQ0hBTkdFCQkJfAlcCisJCQlFVEhfTUFYX1JYX1BBQ0tFVF8xNTUyQllURQkJfAlcCisJCQlFVEhfQ0xSX0VYVF9MT09QQkFDSwkJCXwJXAorCQkJRVRIX1NFVF9GVUxMX0RVUExFWF9NT0RFCQl8CVwKKwkJCUVUSF9FTkFCTEVfRkxPV19DVFJMX1RYX1JYX0lOX0ZVTExfRFVQTEVYOworCisjZGVmaW5lIFJYX0JVRkZFUl9NQVhfU0laRSAgMHhGRkZGCisjZGVmaW5lIFRYX0JVRkZFUl9NQVhfU0laRSAgMHhGRkZGICAgLyogQnVmZmVyIGFyZSBsaW1pdGVkIHRvIDY0ayAqLworCisjZGVmaW5lIFJYX0JVRkZFUl9NSU5fU0laRSAgMHg4CisjZGVmaW5lIFRYX0JVRkZFUl9NSU5fU0laRSAgMHg4CisKKy8qIFR4IFdSUiBjb25mb2d1cmF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBQT1JUX01BWF9UUkFOX1VOSVQJICAgIDB4MjQgICAgLyogTVRVIHJlZ2lzdGVyIChkZWZhdWx0KSA5S0J5dGUgKi8KKyNkZWZpbmUgUE9SVF9NQVhfVE9LRU5fQlVDS0VUX1NJWkUgIDB4X2ZGRkYgIC8qIFBNVEJTIHJlZ2lzdGVyIChkZWZhdWx0KSAgICAgICovCisjZGVmaW5lIFBPUlRfVE9LRU5fUkFURQkJICAgIDEwMjMgICAgLyogUFRUQlJDIHJlZ2lzdGVyIChkZWZhdWx0KSAgICAgKi8KKworLyogTUFDIGFjY2VwZXQvcmVqZWN0IG1hY3JvcyAqLworI2RlZmluZSBBQ0NFUFRfTUFDX0FERFIJICAgIDAKKyNkZWZpbmUgUkVKRUNUX01BQ19BRERSCSAgICAxCisKKy8qIFNpemUgb2YgYSBUeC9SeCBkZXNjcmlwdG9yIHVzZWQgaW4gY2hhaW4gbGlzdCBkYXRhIHN0cnVjdHVyZSAqLworI2RlZmluZSBSWF9ERVNDX0FMSUdORURfU0laRQkJMHgyMAorI2RlZmluZSBUWF9ERVNDX0FMSUdORURfU0laRQkJMHgyMAorCisvKiBBbiBvZmZlc3QgaW4gVHggZGVzY3JpcHRvcnMgdG8gc3RvcmUgZGF0YSBmb3IgYnVmZmVycyBsZXNzIHRoYW4gOCBCeXRlcyAqLworI2RlZmluZSBUWF9CVUZfT0ZGU0VUX0lOX0RFU0MJICAgIDB4MTgKKy8qIEJ1ZmZlciBvZmZzZXQgZnJvbSBidWZmZXIgcG9pbnRlciAqLworI2RlZmluZSBSWF9CVUZfT0ZGU0VUCQkJCTB4MgorCisvKiBHYXAgZGVmaW5lICovCisjZGVmaW5lIEVUSF9CQVJfR0FQCQkJCQkweDgKKyNkZWZpbmUgRVRIX1NJWkVfUkVHX0dBUAkJCQkweDgKKyNkZWZpbmUgRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfR0FQCQkJMHg0CisjZGVmaW5lIEVUSF9QT1JUX0FDQ0VTU19DVFJMX0dBUAkJCTB4NAorCisvKiBHaWdhYml0IEV0aGVybmV0IFVuaXQgR2xvYmFsIFJlZ2lzdGVycyAqLworCisvKiBNSUIgQ291bnRlcnMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9MT1cgICAweDAKKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdIICAweDQKKyNkZWZpbmUgRVRIX01JQl9CQURfT0NURVRTX1JFQ0VJVkVECSAgIDB4OAorI2RlZmluZSBFVEhfTUlCX0lOVEVSTkFMX01BQ19UUkFOU01JVF9FUlIgIDB4YworI2RlZmluZSBFVEhfTUlCX0dPT0RfRlJBTUVTX1JFQ0VJVkVECSAgIDB4MTAKKyNkZWZpbmUgRVRIX01JQl9CQURfRlJBTUVTX1JFQ0VJVkVECSAgIDB4MTQKKyNkZWZpbmUgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1JFQ0VJVkVEICAweDE4CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19SRUNFSVZFRCAgMHgxYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NF9PQ1RFVFMJICAgMHgyMAorI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NV9UT18xMjdfT0NURVRTCSAgIDB4MjQKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMTI4X1RPXzI1NV9PQ1RFVFMgICAweDI4CisjZGVmaW5lIEVUSF9NSUJfRlJBTUVTXzI1Nl9UT181MTFfT0NURVRTICAgMHgyYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU181MTJfVE9fMTAyM19PQ1RFVFMgIDB4MzAKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMTAyNF9UT19NQVhfT0NURVRTICAweDM0CisjZGVmaW5lIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9MT1cJICAgMHgzOAorI2RlZmluZSBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfSElHSAkgICAweDNjCisjZGVmaW5lIEVUSF9NSUJfR09PRF9GUkFNRVNfU0VOVAkgICAweDQwCisjZGVmaW5lIEVUSF9NSUJfRVhDRVNTSVZFX0NPTExJU0lPTgkgICAweDQ0CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19TRU5UCSAgIDB4NDgKKyNkZWZpbmUgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1NFTlQJICAgMHg0YworI2RlZmluZSBFVEhfTUlCX1VOUkVDX01BQ19DT05UUk9MX1JFQ0VJVkVEIDB4NTAKKyNkZWZpbmUgRVRIX01JQl9GQ19TRU5UCQkJICAgMHg1NAorI2RlZmluZSBFVEhfTUlCX0dPT0RfRkNfUkVDRUlWRUQJICAgMHg1OAorI2RlZmluZSBFVEhfTUlCX0JBRF9GQ19SRUNFSVZFRAkJICAgMHg1YworI2RlZmluZSBFVEhfTUlCX1VOREVSU0laRV9SRUNFSVZFRAkgICAweDYwCisjZGVmaW5lIEVUSF9NSUJfRlJBR01FTlRTX1JFQ0VJVkVECSAgIDB4NjQKKyNkZWZpbmUgRVRIX01JQl9PVkVSU0laRV9SRUNFSVZFRAkgICAweDY4CisjZGVmaW5lIEVUSF9NSUJfSkFCQkVSX1JFQ0VJVkVECQkgICAweDZjCisjZGVmaW5lIEVUSF9NSUJfTUFDX1JFQ0VJVkVfRVJST1IJICAgMHg3MAorI2RlZmluZSBFVEhfTUlCX0JBRF9DUkNfRVZFTlQJCSAgIDB4NzQKKyNkZWZpbmUgRVRIX01JQl9DT0xMSVNJT04JCSAgIDB4NzgKKyNkZWZpbmUgRVRIX01JQl9MQVRFX0NPTExJU0lPTgkJICAgMHg3YworCisvKiBQb3J0IHNlcmlhbCBzdGF0dXMgcmVnIChQU1IpICovCisjZGVmaW5lIEVUSF9JTlRFUkZBQ0VfR01JSV9NSUkJCQkJMAorI2RlZmluZSBFVEhfSU5URVJGQUNFX1BDTQkJCQlCSVQwCisjZGVmaW5lIEVUSF9MSU5LX0lTX0RPV04JCQkJMAorI2RlZmluZSBFVEhfTElOS19JU19VUAkJCQkJQklUMQorI2RlZmluZSBFVEhfUE9SVF9BVF9IQUxGX0RVUExFWAkJCQkwCisjZGVmaW5lIEVUSF9QT1JUX0FUX0ZVTExfRFVQTEVYCQkJCUJJVDIKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9ESVNBQkxFRAkJCTAKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9FTkJBTEVECQkJQklUMworI2RlZmluZSBFVEhfR01JSV9TUEVFRF8xMDBfMTAJCQkJMAorI2RlZmluZSBFVEhfR01JSV9TUEVFRF8xMDAwCQkJCUJJVDQKKyNkZWZpbmUgRVRIX01JSV9TUEVFRF8xMAkJCQkwCisjZGVmaW5lIEVUSF9NSUlfU1BFRURfMTAwCQkJCUJJVDUKKyNkZWZpbmUgRVRIX05PX1RYCQkJCQkwCisjZGVmaW5lIEVUSF9UWF9JTl9QUk9HUkVTUwkJCQlCSVQ3CisjZGVmaW5lIEVUSF9CWVBBU1NfTk9fQUNUSVZFCQkJCTAKKyNkZWZpbmUgRVRIX0JZUEFTU19BQ1RJVkUJCQkJQklUOAorI2RlZmluZSBFVEhfUE9SVF9OT1RfQVRfUEFSVElUSU9OX1NUQVRFCQkJMAorI2RlZmluZSBFVEhfUE9SVF9BVF9QQVJUSVRJT05fU1RBVEUJCQlCSVQ5CisjZGVmaW5lIEVUSF9QT1JUX1RYX0ZJRk9fTk9UX0VNUFRZCQkJMAorI2RlZmluZSBFVEhfUE9SVF9UWF9GSUZPX0VNUFRZCQkJCUJJVDEwCisKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBjb25maWd1cmF0aW9uIHJlZyAoUHhfY1IpIGJpdHMgKi8KKyNkZWZpbmUgRVRIX1VOSUNBU1RfTk9STUFMX01PREUJCQkJMAorI2RlZmluZSBFVEhfVU5JQ0FTVF9QUk9NSVNDVU9VU19NT0RFCQkJQklUMAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV8wCQkJCTAKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfMQkJCQlCSVQxCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1FVRVVFXzIJCQkJQklUMgorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV8zCQkJCShCSVQyIHwgQklUMSkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfNAkJCQlCSVQzCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1FVRVVFXzUJCQkJKEJJVDMgfCBCSVQxKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9RVUVVRV82CQkJCShCSVQzIHwgQklUMikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfUVVFVUVfNwkJCQkoQklUMyB8IEJJVDIgfCBCSVQxKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfMAkJCTAKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzEJCQlCSVQ0CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV8yCQkJQklUNQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfMwkJCShCSVQ1IHwgQklUNCkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzQJCQlCSVQ2CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0FSUF9RVUVVRV81CQkJKEJJVDYgfCBCSVQ0KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9BUlBfUVVFVUVfNgkJCShCSVQ2IHwgQklUNSkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQVJQX1FVRVVFXzcJCQkoQklUNiB8IEJJVDUgfCBCSVQ0KQorI2RlZmluZSBFVEhfUkVDRUlWRV9CQ19JRl9OT1RfSVBfT1JfQVJQCQkJMAorI2RlZmluZSBFVEhfUkVKRUNUX0JDX0lGX05PVF9JUF9PUl9BUlAJCQlCSVQ3CisjZGVmaW5lIEVUSF9SRUNFSVZFX0JDX0lGX0lQCQkJCTAKKyNkZWZpbmUgRVRIX1JFSkVDVF9CQ19JRl9JUAkJCQlCSVQ4CisjZGVmaW5lIEVUSF9SRUNFSVZFX0JDX0lGX0FSUAkJCQkwCisjZGVmaW5lIEVUSF9SRUpFQ1RfQkNfSUZfQVJQCQkJCUJJVDkKKyNkZWZpbmUgRVRIX1RYX0FNX05PX1VQREFURV9FUlJPUl9TVU1NQVJZCQlCSVQxMgorI2RlZmluZSBFVEhfQ0FQVFVSRV9UQ1BfRlJBTUVTX0RJUwkJCTAKKyNkZWZpbmUgRVRIX0NBUFRVUkVfVENQX0ZSQU1FU19FTgkJCUJJVDE0CisjZGVmaW5lIEVUSF9DQVBUVVJFX1VEUF9GUkFNRVNfRElTCQkJMAorI2RlZmluZSBFVEhfQ0FQVFVSRV9VRFBfRlJBTUVTX0VOCQkJQklUMTUKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzAJCQkwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV8xCQkJQklUMTYKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVENQX1FVRVVFXzIJCQlCSVQxNworI2RlZmluZSBFVEhfREVGQVVMVF9SWF9UQ1BfUVVFVUVfMwkJCShCSVQxNyB8IEJJVDE2KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9UQ1BfUVVFVUVfNAkJCUJJVDE4CisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV81CQkJKEJJVDE4IHwgQklUMTYpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV82CQkJKEJJVDE4IHwgQklUMTcpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1RDUF9RVUVVRV83CQkJKEJJVDE4IHwgQklUMTcgfCBCSVQxNikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzAJCQkwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX1VEUF9RVUVVRV8xCQkJQklUMTkKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfVURQX1FVRVVFXzIJCQlCSVQyMAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfMwkJCShCSVQyMCB8IEJJVDE5KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNAkJCShCSVQyMQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNQkJCShCSVQyMSB8IEJJVDE5KQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNgkJCShCSVQyMSB8IEJJVDIwKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9VRFBfUVVFVUVfNwkJCShCSVQyMSB8IEJJVDIwIHwgQklUMTkpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMAkJCSAwCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMQkJCUJJVDIyCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMgkJCUJJVDIzCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMwkJCShCSVQyMyB8IEJJVDIyKQorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzQJCQlCSVQyNAorI2RlZmluZSBFVEhfREVGQVVMVF9SWF9CUERVX1FVRVVFXzUJCQkoQklUMjQgfCBCSVQyMikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQlBEVV9RVUVVRV82CQkJKEJJVDI0IHwgQklUMjMpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNwkJCShCSVQyNCB8IEJJVDIzIHwgQklUMjIpCisKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBjb25maWd1cmF0aW9uIGV4dGVuZCByZWcgKFB4X2NYUikgYml0cyovCisjZGVmaW5lIEVUSF9DTEFTU0lGWV9FTgkJCQkJQklUMAorI2RlZmluZSBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfQVNfTk9STUFMCQkJMAorI2RlZmluZSBFVEhfU1BBTl9CUERVX1BBQ0tFVFNfVE9fUlhfUVVFVUVfNwkJQklUMQorI2RlZmluZSBFVEhfUEFSVElUSU9OX0RJU0FCTEUJCQkJMAorI2RlZmluZSBFVEhfUEFSVElUSU9OX0VOQUJMRQkJCQlCSVQyCisKKworLyogVHgvUnggcXVldWUgY29tbWFuZCByZWcgKFJRQ1IvVFFDUikqLworI2RlZmluZSBFVEhfUVVFVUVfMF9FTkFCTEUJCQkJQklUMAorI2RlZmluZSBFVEhfUVVFVUVfMV9FTkFCTEUJCQkJQklUMQorI2RlZmluZSBFVEhfUVVFVUVfMl9FTkFCTEUJCQkJQklUMgorI2RlZmluZSBFVEhfUVVFVUVfM19FTkFCTEUJCQkJQklUMworI2RlZmluZSBFVEhfUVVFVUVfNF9FTkFCTEUJCQkJQklUNAorI2RlZmluZSBFVEhfUVVFVUVfNV9FTkFCTEUJCQkJQklUNQorI2RlZmluZSBFVEhfUVVFVUVfNl9FTkFCTEUJCQkJQklUNgorI2RlZmluZSBFVEhfUVVFVUVfN19FTkFCTEUJCQkJQklUNworI2RlZmluZSBFVEhfUVVFVUVfMF9ESVNBQkxFCQkJCUJJVDgKKyNkZWZpbmUgRVRIX1FVRVVFXzFfRElTQUJMRQkJCQlCSVQ5CisjZGVmaW5lIEVUSF9RVUVVRV8yX0RJU0FCTEUJCQkJQklUMTAKKyNkZWZpbmUgRVRIX1FVRVVFXzNfRElTQUJMRQkJCQlCSVQxMQorI2RlZmluZSBFVEhfUVVFVUVfNF9ESVNBQkxFCQkJCUJJVDEyCisjZGVmaW5lIEVUSF9RVUVVRV81X0RJU0FCTEUJCQkJQklUMTMKKyNkZWZpbmUgRVRIX1FVRVVFXzZfRElTQUJMRQkJCQlCSVQxNAorI2RlZmluZSBFVEhfUVVFVUVfN19ESVNBQkxFCQkJCUJJVDE1CisKKy8qIFRoZXNlIG1hY3JvcyBkZXNjcmliZXMgdGhlIFBvcnQgU2RtYSBjb25maWd1cmF0aW9uIHJlZyAoU0RDUikgYml0cyAqLworI2RlZmluZSBFVEhfUklGQgkJCQkJQklUMAorI2RlZmluZSBFVEhfUlhfQlVSU1RfU0laRV8xXzY0QklUCQkJMAorI2RlZmluZSBFVEhfUlhfQlVSU1RfU0laRV8yXzY0QklUCQkJQklUMQorI2RlZmluZSBFVEhfUlhfQlVSU1RfU0laRV80XzY0QklUCQkJQklUMgorI2RlZmluZSBFVEhfUlhfQlVSU1RfU0laRV84XzY0QklUCQkJKEJJVDIgfCBCSVQxKQorI2RlZmluZSBFVEhfUlhfQlVSU1RfU0laRV8xNl82NEJJVAkJCUJJVDMKKyNkZWZpbmUgRVRIX0JMTV9SWF9OT19TV0FQCQkJCUJJVDQKKyNkZWZpbmUgRVRIX0JMTV9SWF9CWVRFX1NXQVAJCQkJMAorI2RlZmluZSBFVEhfQkxNX1RYX05PX1NXQVAJCQkJQklUNQorI2RlZmluZSBFVEhfQkxNX1RYX0JZVEVfU1dBUAkJCQkwCisjZGVmaW5lIEVUSF9ERVNDUklQVE9SU19CWVRFX1NXQVAJCQlCSVQ2CisjZGVmaW5lIEVUSF9ERVNDUklQVE9SU19OT19TV0FQCQkJCTAKKyNkZWZpbmUgRVRIX1RYX0JVUlNUX1NJWkVfMV82NEJJVAkJCTAKKyNkZWZpbmUgRVRIX1RYX0JVUlNUX1NJWkVfMl82NEJJVAkJCUJJVDIyCisjZGVmaW5lIEVUSF9UWF9CVVJTVF9TSVpFXzRfNjRCSVQJCQlCSVQyMworI2RlZmluZSBFVEhfVFhfQlVSU1RfU0laRV84XzY0QklUCQkJKEJJVDIzIHwgQklUMjIpCisjZGVmaW5lIEVUSF9UWF9CVVJTVF9TSVpFXzE2XzY0QklUCQkJQklUMjQKKworLyogVGhlc2UgbWFjcm9zIGRlc2NyaWJlcyB0aGUgUG9ydCBzZXJpYWwgY29udHJvbCByZWcgKFBTQ1IpIGJpdHMgKi8KKyNkZWZpbmUgRVRIX1NFUklBTF9QT1JUX0RJU0FCTEUJCQkJMAorI2RlZmluZSBFVEhfU0VSSUFMX1BPUlRfRU5BQkxFCQkJCUJJVDAKKyNkZWZpbmUgRVRIX0ZPUkNFX0xJTktfUEFTUwkJCQlCSVQxCisjZGVmaW5lIEVUSF9ET19OT1RfRk9SQ0VfTElOS19QQVNTCQkJMAorI2RlZmluZSBFVEhfRU5BQkxFX0FVVE9fTkVHX0ZPUl9EVVBMWAkJCTAKKyNkZWZpbmUgRVRIX0RJU0FCTEVfQVVUT19ORUdfRk9SX0RVUExYCQkJQklUMgorI2RlZmluZSBFVEhfRU5BQkxFX0FVVE9fTkVHX0ZPUl9GTE9XX0NUUkwJCTAKKyNkZWZpbmUgRVRIX0RJU0FCTEVfQVVUT19ORUdfRk9SX0ZMT1dfQ1RSTAkJQklUMworI2RlZmluZSBFVEhfQURWX05PX0ZMT1dfQ1RSTAkJCQkwCisjZGVmaW5lIEVUSF9BRFZfU1lNTUVUUklDX0ZMT1dfQ1RSTAkJCUJJVDQKKyNkZWZpbmUgRVRIX0ZPUkNFX0ZDX01PREVfTk9fUEFVU0VfRElTX1RYCQkwCisjZGVmaW5lIEVUSF9GT1JDRV9GQ19NT0RFX1RYX1BBVVNFX0RJUwkJCUJJVDUKKyNkZWZpbmUgRVRIX0ZPUkNFX0JQX01PREVfTk9fSkFNCQkJMAorI2RlZmluZSBFVEhfRk9SQ0VfQlBfTU9ERV9KQU1fVFgJCQlCSVQ3CisjZGVmaW5lIEVUSF9GT1JDRV9CUF9NT0RFX0pBTV9UWF9PTl9SWF9FUlIJCUJJVDgKKyNkZWZpbmUgRVRIX0ZPUkNFX0xJTktfRkFJTAkJCQkwCisjZGVmaW5lIEVUSF9ET19OT1RfRk9SQ0VfTElOS19GQUlMCQkJQklUMTAKKyNkZWZpbmUgRVRIX1JFVFJBTlNNSVRfMTZfRVRURU1QVFMJCQkwCisjZGVmaW5lIEVUSF9SRVRSQU5TTUlUX0ZPUkVWRVIJCQkJQklUMTEKKyNkZWZpbmUgRVRIX0RJU0FCTEVfQVVUT19ORUdfU1BFRURfR01JSQkJCUJJVDEzCisjZGVmaW5lIEVUSF9FTkFCTEVfQVVUT19ORUdfU1BFRURfR01JSQkJCTAKKyNkZWZpbmUgRVRIX0RURV9BRFZfMAkJCQkJMAorI2RlZmluZSBFVEhfRFRFX0FEVl8xCQkJCQlCSVQxNAorI2RlZmluZSBFVEhfRElTQUJMRV9BVVRPX05FR19CWVBBU1MJCQkwCisjZGVmaW5lIEVUSF9FTkFCTEVfQVVUT19ORUdfQllQQVNTCQkJQklUMTUKKyNkZWZpbmUgRVRIX0FVVE9fTkVHX05PX0NIQU5HRQkJCQkwCisjZGVmaW5lIEVUSF9SRVNUQVJUX0FVVE9fTkVHCQkJCUJJVDE2CisjZGVmaW5lIEVUSF9NQVhfUlhfUEFDS0VUXzE1MThCWVRFCQkJMAorI2RlZmluZSBFVEhfTUFYX1JYX1BBQ0tFVF8xNTIyQllURQkJCUJJVDE3CisjZGVmaW5lIEVUSF9NQVhfUlhfUEFDS0VUXzE1NTJCWVRFCQkJQklUMTgKKyNkZWZpbmUgRVRIX01BWF9SWF9QQUNLRVRfOTAyMkJZVEUJCQkoQklUMTggfCBCSVQxNykKKyNkZWZpbmUgRVRIX01BWF9SWF9QQUNLRVRfOTE5MkJZVEUJCQlCSVQxOQorI2RlZmluZSBFVEhfTUFYX1JYX1BBQ0tFVF85NzAwQllURQkJCShCSVQxOSB8IEJJVDE3KQorI2RlZmluZSBFVEhfU0VUX0VYVF9MT09QQkFDSwkJCQlCSVQyMAorI2RlZmluZSBFVEhfQ0xSX0VYVF9MT09QQkFDSwkJCQkwCisjZGVmaW5lIEVUSF9TRVRfRlVMTF9EVVBMRVhfTU9ERQkJCUJJVDIxCisjZGVmaW5lIEVUSF9TRVRfSEFMRl9EVVBMRVhfTU9ERQkJCTAKKyNkZWZpbmUgRVRIX0VOQUJMRV9GTE9XX0NUUkxfVFhfUlhfSU5fRlVMTF9EVVBMRVgJQklUMjIKKyNkZWZpbmUgRVRIX0RJU0FCTEVfRkxPV19DVFJMX1RYX1JYX0lOX0ZVTExfRFVQTEVYCTAKKyNkZWZpbmUgRVRIX1NFVF9HTUlJX1NQRUVEX1RPXzEwXzEwMAkJCTAKKyNkZWZpbmUgRVRIX1NFVF9HTUlJX1NQRUVEX1RPXzEwMDAJCQlCSVQyMworI2RlZmluZSBFVEhfU0VUX01JSV9TUEVFRF9UT18xMAkJCQkwCisjZGVmaW5lIEVUSF9TRVRfTUlJX1NQRUVEX1RPXzEwMAkJCUJJVDI0CisKKworLyogU01JIHJlZyAqLworI2RlZmluZSBFVEhfU01JX0JVU1kJCUJJVDI4CS8qIDAgLSBXcml0ZSwgMSAtIFJlYWQJCSovCisjZGVmaW5lIEVUSF9TTUlfUkVBRF9WQUxJRAlCSVQyNwkvKiAwIC0gV3JpdGUsIDEgLSBSZWFkCQkqLworI2RlZmluZSBFVEhfU01JX09QQ09ERV9XUklURQkwCS8qIENvbXBsZXRpb24gb2YgUmVhZCBvcGVyYXRpb24gKi8KKyNkZWZpbmUgRVRIX1NNSV9PUENPREVfUkVBRAlCSVQyNgkvKiBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MJCSovCisKKy8qIFNETUEgY29tbWFuZCBzdGF0dXMgZmllbGRzIG1hY3JvcyAqLworCisvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfRVJST1JfU1VNTUFSWQkJICAgIChCSVQwKQorCisvKiBUeCAmIFJ4IGRlc2NyaXB0b3JzIGNvbW1hbmQgKi8KKyNkZWZpbmUgRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEJCSAgICAoQklUMzEpCisKKy8qIFR4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfTENfRVJST1IJCQkgICAgKDAJICApCisjZGVmaW5lIEVUSF9VUl9FUlJPUgkJCSAgICAoQklUMSApCisjZGVmaW5lIEVUSF9STF9FUlJPUgkJCSAgICAoQklUMiApCisjZGVmaW5lIEVUSF9MTENfU05BUF9GT1JNQVQJCSAgICAoQklUOSApCisKKy8qIFJ4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfQ1JDX0VSUk9SCQkJICAgICgwCSAgKQorI2RlZmluZSBFVEhfT1ZFUlJVTl9FUlJPUgkJICAgIChCSVQxICkKKyNkZWZpbmUgRVRIX01BWF9GUkFNRV9MRU5HVEhfRVJST1IJICAgIChCSVQyICkKKyNkZWZpbmUgRVRIX1JFU09VUkNFX0VSUk9SCQkgICAgKChCSVQyIHwgQklUMSkpCisjZGVmaW5lIEVUSF9WTEFOX1RBR0dFRAkJCSAgICAoQklUMTkpCisjZGVmaW5lIEVUSF9CUERVX0ZSQU1FCQkJICAgIChCSVQyMCkKKyNkZWZpbmUgRVRIX1RDUF9GUkFNRV9PVkVSX0lQX1ZfNAkgICAgKDAJICApCisjZGVmaW5lIEVUSF9VRFBfRlJBTUVfT1ZFUl9JUF9WXzQJICAgIChCSVQyMSkKKyNkZWZpbmUgRVRIX09USEVSX0ZSQU1FX1RZUEUJCSAgICAoQklUMjIpCisjZGVmaW5lIEVUSF9MQVlFUl8yX0lTX0VUSF9WXzIJCSAgICAoQklUMjMpCisjZGVmaW5lIEVUSF9GUkFNRV9UWVBFX0lQX1ZfNAkJICAgIChCSVQyNCkKKyNkZWZpbmUgRVRIX0ZSQU1FX0hFQURFUl9PSwkJICAgIChCSVQyNSkKKyNkZWZpbmUgRVRIX1JYX0xBU1RfREVTQwkJICAgIChCSVQyNikKKyNkZWZpbmUgRVRIX1JYX0ZJUlNUX0RFU0MJCSAgICAoQklUMjcpCisjZGVmaW5lIEVUSF9VTktOT1dOX0RFU1RJTkFUSU9OX0FERFIJICAgIChCSVQyOCkKKyNkZWZpbmUgRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQJCSAgICAoQklUMjkpCisjZGVmaW5lIEVUSF9MQVlFUl80X0NIRUNLU1VNX09LCQkgICAgKEJJVDMwKQorCisvKiBSeCBkZXNjcmlwdG9ycyBieXRlIGNvdW50ICovCisjZGVmaW5lIEVUSF9GUkFNRV9GUkFHTUVOVEVECQkgICAgKEJJVDIpCisKKy8qIFR4IGRlc2NyaXB0b3JzIGNvbW1hbmQgKi8KKyNkZWZpbmUgRVRIX0xBWUVSXzRfQ0hFQ0tTVU1fRklSU1RfREVTQwkJKEJJVDEwKQorI2RlZmluZSBFVEhfRlJBTUVfU0VUX1RPX1ZMQU4JCSAgICAoQklUMTUpCisjZGVmaW5lIEVUSF9UQ1BfRlJBTUUJCQkgICAgKDAJICApCisjZGVmaW5lIEVUSF9VRFBfRlJBTUUJCQkgICAgKEJJVDE2KQorI2RlZmluZSBFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0JICAgIChCSVQxNykKKyNkZWZpbmUgRVRIX0dFTl9JUF9WXzRfQ0hFQ0tTVU0JCSAgICAoQklUMTgpCisjZGVmaW5lIEVUSF9aRVJPX1BBRERJTkcJCSAgICAoQklUMTkpCisjZGVmaW5lIEVUSF9UWF9MQVNUX0RFU0MJCSAgICAoQklUMjApCisjZGVmaW5lIEVUSF9UWF9GSVJTVF9ERVNDCQkgICAgKEJJVDIxKQorI2RlZmluZSBFVEhfR0VOX0NSQwkJCSAgICAoQklUMjIpCisjZGVmaW5lIEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUCQkgICAgKEJJVDIzKQorI2RlZmluZSBFVEhfQVVUT19NT0RFCQkJICAgIChCSVQzMCkKKworLyogQWRkcmVzcyBkZWNvZGUgcGFyYW1ldGVycyAqLworLyogRXRoZXJuZXQgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgRUJBUl9UQVJHRVRfRFJBTQkJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBFQkFSX1RBUkdFVF9ERVZJQ0UJCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRUJBUl9UQVJHRVRfQ0JTCQkJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBFQkFSX1RBUkdFVF9QQ0kwCQkJCQkweDAwMDAwMDAzCisjZGVmaW5lIEVCQVJfVEFSR0VUX1BDSTEJCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRUJBUl9UQVJHRVRfQ1VOSVQJCQkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgRUJBUl9UQVJHRVRfQVVOSVQJCQkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgRUJBUl9UQVJHRVRfR1VOSVQJCQkJCTB4MDAwMDAwMDcKKworLyogV2luZG93IGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fQ1MwCQkJCQkweDAwMDAwRTAwCisjZGVmaW5lIEVCQVJfQVRUUl9EUkFNX0NTMQkJCQkJMHgwMDAwMEQwMAorI2RlZmluZSBFQkFSX0FUVFJfRFJBTV9DUzIJCQkJCTB4MDAwMDBCMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RSQU1fQ1MzCQkJCQkweDAwMDAwNzAwCisKKy8qIERSQU0gVGFyZ2V0IGludGVyZmFjZSAqLworI2RlZmluZSBFQkFSX0FUVFJfRFJBTV9OT19DQUNIRV9DT0hFUkVOQ1kJMHgwMDAwMDAwMAorI2RlZmluZSBFQkFSX0FUVFJfRFJBTV9DQUNIRV9DT0hFUkVOQ1lfV1QJMHgwMDAwMTAwMAorI2RlZmluZSBFQkFSX0FUVFJfRFJBTV9DQUNIRV9DT0hFUkVOQ1lfV0IJMHgwMDAwMjAwMAorCisvKiBEZXZpY2UgQnVzIFRhcmdldCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRUJBUl9BVFRSX0RFVklDRV9ERVZDUzAJCQkJMHgwMDAwMUUwMAorI2RlZmluZSBFQkFSX0FUVFJfREVWSUNFX0RFVkNTMQkJCQkweDAwMDAxRDAwCisjZGVmaW5lIEVCQVJfQVRUUl9ERVZJQ0VfREVWQ1MyCQkJCTB4MDAwMDFCMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0RFVklDRV9ERVZDUzMJCQkJMHgwMDAwMTcwMAorI2RlZmluZSBFQkFSX0FUVFJfREVWSUNFX0JPT1RDUzMJCQkweDAwMDAwRjAwCisKKy8qIFBDSSBUYXJnZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfQllURV9TV0FQCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9OT19TV0FQCQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9CWVRFX1dPUkRfU1dBUAkJMHgwMDAwMDIwMAorI2RlZmluZSBFQkFSX0FUVFJfUENJX1dPUkRfU1dBUAkJCQkweDAwMDAwMzAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfTk9fU05PT1BfTk9UX0FTU0VSVAkweDAwMDAwMDAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfTk9fU05PT1BfQVNTRVJUCQkweDAwMDAwNDAwCisjZGVmaW5lIEVCQVJfQVRUUl9QQ0lfSU9fU1BBQ0UJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBFQkFSX0FUVFJfUENJX01FTU9SWV9TUEFDRQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9SRVE2NF9GT1JDRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX1BDSV9SRVE2NF9TSVpFCQkJMHgwMDAwMTAwMAorCisvKiBDUFUgNjB4IGJ1cyBvciBpbnRlcm5hbCBTUkFNIGludGVyZmFjZSAqLworI2RlZmluZSBFQkFSX0FUVFJfQ0JTX1NSQU1fQkxPQ0swCQkJMHgwMDAwMDAwMAorI2RlZmluZSBFQkFSX0FUVFJfQ0JTX1NSQU1fQkxPQ0sxCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFQkFSX0FUVFJfQ0JTX1NSQU0JCQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRUJBUl9BVFRSX0NCU19DUFVfQlVTCQkJCTB4MDAwMDA4MDAKKworLyogV2luZG93IGFjY2VzcyBjb250cm9sICovCisjZGVmaW5lIEVXSU5fQUNDRVNTX05PVF9BTExPV0VEIDAKKyNkZWZpbmUgRVdJTl9BQ0NFU1NfUkVBRF9PTkxZCUJJVDAKKyNkZWZpbmUgRVdJTl9BQ0NFU1NfRlVMTAkoQklUMSB8IEJJVDApCisjZGVmaW5lIEVXSU4wX0FDQ0VTU19NQVNLCQkweDAwMDMKKyNkZWZpbmUgRVdJTjFfQUNDRVNTX01BU0sJCTB4MDAwQworI2RlZmluZSBFV0lOMl9BQ0NFU1NfTUFTSwkJMHgwMDMwCisjZGVmaW5lIEVXSU4zX0FDQ0VTU19NQVNLCQkweDAwQzAKKworLyogdHlwZWRlZnMgKi8KKwordHlwZWRlZiBlbnVtIF9ldGhfcG9ydAoreworICAgIEVUSF8wID0gMCwKKwlFVEhfMSA9IDEsCisJRVRIXzIgPSAyCit9RVRIX1BPUlQ7CisKK3R5cGVkZWYgZW51bSBfZXRoX2Z1bmNfcmV0X3N0YXR1cworeworICAgIEVUSF9PSywJCQkvKiBSZXR1cm5lZCBhcyBleHBlY3RlZC4JCSAgICAqLworICAgIEVUSF9FUlJPUiwJCQkvKiBGdW5kYW1lbnRhbCBlcnJvci4JCQkgICAgKi8KKyAgICBFVEhfUkVUUlksCQkJLyogQ291bGQgbm90IHByb2Nlc3MgcmVxdWVzdC4gVHJ5IGxhdGVyLiAgICAqLworICAgIEVUSF9FTkRfT0ZfSk9CLAkJLyogUmluZyBoYXMgbm90aGluZyB0byBwcm9jZXNzLgkJICAgICovCisgICAgRVRIX1FVRVVFX0ZVTEwsCQkvKiBSaW5nIHJlc291cmNlIGVycm9yLgkJCSAgICAqLworICAgIEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFCS8qIFJpbmcgcmVzb3VyY2VzIGFib3V0IHRvIGV4aGF1c3QuCSAgICAqLworfUVUSF9GVU5DX1JFVF9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfZXRoX3F1ZXVlCit7CisJRVRIX1EwID0gMCwKKwlFVEhfUTEgPSAxLAorCUVUSF9RMiA9IDIsCisJRVRIX1EzID0gMywKKwlFVEhfUTQgPSA0LAorCUVUSF9RNSA9IDUsCisJRVRIX1E2ID0gNiwKKyAgICBFVEhfUTcgPSA3Cit9IEVUSF9RVUVVRTsKKwordHlwZWRlZiBlbnVtIF9hZGRyX3dpbgoreworCUVUSF9XSU4wLAorCUVUSF9XSU4xLAorCUVUSF9XSU4yLAorCUVUSF9XSU4zLAorCUVUSF9XSU40LAorICAgIEVUSF9XSU41Cit9IEVUSF9BRERSX1dJTjsKKwordHlwZWRlZiBlbnVtIF9ldGhfdGFyZ2V0Cit7CisJRVRIX1RBUkdFVF9EUkFNCSAsCisJRVRIX1RBUkdFVF9ERVZJQ0UsCisJRVRIX1RBUkdFVF9DQlMJICwKKwlFVEhfVEFSR0VUX1BDSTAJICwKKwlFVEhfVEFSR0VUX1BDSTEKK31FVEhfVEFSR0VUOworCit0eXBlZGVmIHN0cnVjdCBfZXRoX3J4X2Rlc2MKK3sKKwl1bnNpZ25lZCBzaG9ydAlieXRlX2NudAkgICA7CS8qIERlc2NyaXB0b3IgYnVmZmVyIGJ5dGUgY291bnQJICAgICovCisJdW5zaWduZWQgc2hvcnQJYnVmX3NpemUJICAgOwkvKiBCdWZmZXIgc2l6ZQkJCSAgICAqLworCXVuc2lnbmVkIGludAljbWRfc3RzCSAgIDsJLyogRGVzY3JpcHRvciBjb21tYW5kIHN0YXR1cwkgICAgKi8KKwl1bnNpZ25lZCBpbnQJbmV4dF9kZXNjX3B0cjsJICAvKiBOZXh0IGRlc2NyaXB0b3IgcG9pbnRlcgkgICAgICAqLworCXVuc2lnbmVkIGludAlidWZfcHRyCSAgIDsJLyogRGVzY3JpcHRvciBidWZmZXIgcG9pbnRlcgkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgcmV0dXJuX2luZm8gOyAgICAvKiBVc2VyIHJlc291cmNlIHJldHVybiBpbmZvcm1hdGlvbiAqLworfSBFVEhfUlhfREVTQzsKKworCit0eXBlZGVmIHN0cnVjdCBfZXRoX3R4X2Rlc2MKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCAgYnl0ZV9jbnQJICAgOwkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50CSAgICAqLworICAgIHVuc2lnbmVkIHNob3J0ICBsNGlfY2hrCSAgIDsJLyogQ1BVIHByb3ZpZGVkIFRDUCBDaGVja3N1bQkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgY21kX3N0cwkgICA7CS8qIERlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMJICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIG5leHRfZGVzY19wdHI7ICAgIC8qIE5leHQgZGVzY3JpcHRvciBwb2ludGVyCSAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgYnVmX3B0cgkgICA7CS8qIERlc2NyaXB0b3IgYnVmZmVyIHBvaW50ZXIJICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIHJldHVybl9pbmZvIDsgICAgLyogVXNlciByZXNvdXJjZSByZXR1cm4gaW5mb3JtYXRpb24gKi8KK30gRVRIX1RYX0RFU0M7CisKKy8qIFVuaWZpZWQgc3RydWN0IGZvciBSeCBhbmQgVHggb3BlcmF0aW9ucy4gVGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvICovCisvKiBiZSBmYW1pbGllciB3aXRoIG5laXRoZXIgVHggbm9yIFJ4IGRlc2NyaXB0b3JzLgkJCSAqLwordHlwZWRlZiBzdHJ1Y3QgX3BrdF9pbmZvCit7CisJdW5zaWduZWQgc2hvcnQJYnl0ZV9jbnQgICA7CS8qIERlc2NyaXB0b3IgYnVmZmVyIGJ5dGUgY291bnQJICAgICovCisJdW5zaWduZWQgc2hvcnQJbDRpX2NoawkgICA7CS8qIFR4IENQVSBwcm92aWRlZCBUQ1AgQ2hlY2tzdW0JICAgICovCisJdW5zaWduZWQgaW50CWNtZF9zdHMJICAgOwkvKiBEZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzCSAgICAqLworCXVuc2lnbmVkIGludAlidWZfcHRyCSAgIDsJLyogRGVzY3JpcHRvciBidWZmZXIgcG9pbnRlcgkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgcmV0dXJuX2luZm8gOyAgICAvKiBVc2VyIHJlc291cmNlIHJldHVybiBpbmZvcm1hdGlvbiAqLworfSBQS1RfSU5GTzsKKworCit0eXBlZGVmIHN0cnVjdCBfZXRoX3dpbl9wYXJhbQoreworICAgIEVUSF9BRERSX1dJTiB3aW47CS8qIFdpbmRvdyBudW1iZXIuIFNlZSBFVEhfQUREUl9XSU4gZW51bSAqLworICAgIEVUSF9UQVJHRVQJdGFyZ2V0OwkgICAvKiBTeXN0ZW0gdGFyZ2V0cy4gU2VlIEVUSF9UQVJHRVQgZW51bSAqLworICAgIHVuc2lnbmVkIHNob3J0IGF0dHJpYnV0ZXM7CS8qIEJBUiBhdHRyaWJ1dGVzLiBTZWUgYWJvdmUgbWFjcm9zLiAqLworICAgIHVuc2lnbmVkIGludCBiYXNlX2FkZHI7IC8qIFdpbmRvdyBiYXNlIGFkZHJlc3MgaW4gdW5zaWduZWQgaW50IGZvcm0gKi8KKyAgICB1bnNpZ25lZCBpbnQgaGlnaF9hZGRyOyAvKiBXaW5kb3cgaGlnaCBhZGRyZXNzIGluIHVuc2lnbmVkIGludCBmb3JtICovCisgICAgdW5zaWduZWQgaW50IHNpemU7IC8qIFNpemUgaW4gTUJ5dGVzLiBNdXN0IGJlICUgNjRLYnl0ZS4gKi8KKyAgICBib29sIGVuYWJsZTsgLyogRW5hYmxlL2Rpc2FibGUgYWNjZXNzIHRvIHRoZSB3aW5kb3cuICovCisgICAgdW5zaWduZWQgc2hvcnQgYWNjZXNzX2N0cmw7IC8qIEFjY2VzcyBjdHJsIHJlZ2lzdGVyLiBzZWUgYWJvdmUgbWFjcm9zICovCit9IEVUSF9XSU5fUEFSQU07CisKKworLyogRXRoZXJuZXQgcG9ydCBzcGVjaWZpYyBpbmZvbWF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IF9ldGhfcG9ydF9jdHJsCit7CisgICAgRVRIX1BPUlQgIHBvcnRfbnVtOyAvKiBVc2VyIEV0aGVybmV0IHBvcnQgbnVtYmVyICovCisgICAgaW50IHBvcnRfcGh5X2FkZHI7CS8qIFVzZXIgcGh5IGFkZHJlc3Mgb2YgRXRocm5ldCBwb3J0ICovCisgICAgdW5zaWduZWQgY2hhciBwb3J0X21hY19hZGRyWzZdOyAvKiBVc2VyIGRlZmluZWQgcG9ydCBNQUMgYWRkcmVzcy4gKi8KKyAgICB1bnNpZ25lZCBpbnQgIHBvcnRfY29uZmlnOyAvKiBVc2VyIHBvcnQgY29uZmlndXJhdGlvbiB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGludCAgcG9ydF9jb25maWdfZXh0ZW5kOyAvKiBVc2VyIHBvcnQgY29uZmlnIGV4dGVuZCB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGludCAgcG9ydF9zZG1hX2NvbmZpZzsgLyogVXNlciBwb3J0IFNETUEgY29uZmlnIHZhbHVlICovCisgICAgdW5zaWduZWQgaW50ICBwb3J0X3NlcmlhbF9jb250cm9sOyAvKiBVc2VyIHBvcnQgc2VyaWFsIGNvbnRyb2wgdmFsdWUgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHBvcnRfdHhfcXVldWVfY29tbWFuZDsgLyogUG9ydCBhY3RpdmUgVHggcXVldWVzIHN1bW1hcnkgKi8KKyAgICB1bnNpZ25lZCBpbnQgIHBvcnRfcnhfcXVldWVfY29tbWFuZDsgLyogUG9ydCBhY3RpdmUgUnggcXVldWVzIHN1bW1hcnkgKi8KKworICAgIC8qIFVzZXIgZnVuY3Rpb24gdG8gY2FzdCB2aXJ0dWFsIGFkZHJlc3MgdG8gQ1BVIGJ1cyBhZGRyZXNzICovCisgICAgdW5zaWduZWQgaW50ICAoKnBvcnRfdmlydF90b19waHlzKSh1bnNpZ25lZCBpbnQgYWRkcik7CisgICAgLyogVXNlciBzY3JhdGNoIHBhZCBmb3IgdXNlciBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMgKi8KKyAgICB2b2lkICpwb3J0X3ByaXZhdGU7CisKKyAgICBib29sIHJ4X3Jlc291cmNlX2VycltNQVhfUlhfUVVFVUVfTlVNXTsgLyogUnggcmluZyByZXNvdXJjZSBlcnJvciBmbGFnICovCisgICAgYm9vbCB0eF9yZXNvdXJjZV9lcnJbTUFYX1RYX1FVRVVFX05VTV07IC8qIFR4IHJpbmcgcmVzb3VyY2UgZXJyb3IgZmxhZyAqLworCisgICAgLyogVHgvUnggcmluZ3MgbWFuYWdtZW50IGluZGV4ZXMgZmllbGRzLiBGb3IgZHJpdmVyIHVzZSAqLworCisgICAgLyogTmV4dCBhdmFpbGFibGUgUnggcmVzb3VyY2UgKi8KKyAgICB2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF9yeF9jdXJyX2Rlc2NfcVtNQVhfUlhfUVVFVUVfTlVNXTsKKyAgICAvKiBSZXR1cm5pbmcgUnggcmVzb3VyY2UgKi8KKyAgICB2b2xhdGlsZSBFVEhfUlhfREVTQyAqcF9yeF91c2VkX2Rlc2NfcVtNQVhfUlhfUVVFVUVfTlVNXTsKKworICAgIC8qIE5leHQgYXZhaWxhYmxlIFR4IHJlc291cmNlICovCisgICAgdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfY3Vycl9kZXNjX3FbTUFYX1RYX1FVRVVFX05VTV07CisgICAgLyogUmV0dXJuaW5nIFR4IHJlc291cmNlICovCisgICAgdm9sYXRpbGUgRVRIX1RYX0RFU0MgKnBfdHhfdXNlZF9kZXNjX3FbTUFYX1RYX1FVRVVFX05VTV07CisgICAgLyogQW4gZXh0cmEgVHggaW5kZXggdG8gc3VwcG9ydCB0cmFuc21pdCBvZiBtdWx0aXBsZSBidWZmZXJzIHBlciBwYWNrZXQgKi8KKyAgICB2b2xhdGlsZSBFVEhfVFhfREVTQyAqcF90eF9maXJzdF9kZXNjX3FbTUFYX1RYX1FVRVVFX05VTV07CisKKyAgICAvKiBUeC9SeCByaW5ncyBzaXplIGFuZCBiYXNlIHZhcmlhYmxlcyBmaWVsZHMuIEZvciBkcml2ZXIgdXNlICovCisKKyAgICB2b2xhdGlsZSBFVEhfUlhfREVTQwkqcF9yeF9kZXNjX2FyZWFfYmFzZVtNQVhfUlhfUVVFVUVfTlVNXTsKKyAgICB1bnNpZ25lZCBpbnQJCSByeF9kZXNjX2FyZWFfc2l6ZVtNQVhfUlhfUVVFVUVfTlVNXTsKKyAgICBjaGFyCQkJKnBfcnhfYnVmZmVyX2Jhc2VbTUFYX1JYX1FVRVVFX05VTV07CisKKyAgICB2b2xhdGlsZSBFVEhfVFhfREVTQwkqcF90eF9kZXNjX2FyZWFfYmFzZVtNQVhfVFhfUVVFVUVfTlVNXTsKKyAgICB1bnNpZ25lZCBpbnQJCSB0eF9kZXNjX2FyZWFfc2l6ZVtNQVhfVFhfUVVFVUVfTlVNXTsKKyAgICBjaGFyCQkJKnBfdHhfYnVmZmVyX2Jhc2VbTUFYX1RYX1FVRVVFX05VTV07CisKK30gRVRIX1BPUlRfSU5GTzsKKworCisvKiBldGhlcm5ldC5oIEFQSSBsaXN0ICovCisKKy8qIFBvcnQgb3BlcmF0aW9uIGNvbnRyb2wgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X2luaXQgKEVUSF9QT1JUX0lORk8gKnBfZXRoX3BvcnRfY3RybCk7CitzdGF0aWMgdm9pZCBldGhfcG9ydF9yZXNldChFVEhfUE9SVAlldGhfcG9ydF9udW0pOworc3RhdGljIGJvb2wgZXRoX3BvcnRfc3RhcnQoRVRIX1BPUlRfSU5GTyAqcF9ldGhfcG9ydF9jdHJsKTsKKworCisvKiBQb3J0IE1BQyBhZGRyZXNzIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX3NldCAoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgdW5zaWduZWQgY2hhciAqcF9hZGRyLAorCQkJCSAgRVRIX1FVRVVFIHF1ZXVlKTsKKyNpZiAwCS8qIEZJWE1FICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9tY19hZGRyCShFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJIHVuc2lnbmVkIGNoYXIgKnBfYWRkciwKKwkJCQkgRVRIX1FVRVVFIHF1ZXVlLAorCQkJCSBpbnQgb3B0aW9uKTsKKyNlbmRpZgorCisvKiBQSFkgYW5kIE1JQiByb3V0aW5lcyAqLworc3RhdGljIGJvb2wgZXRoZXJuZXRfcGh5X3Jlc2V0KEVUSF9QT1JUIGV0aF9wb3J0X251bSk7CisKK3N0YXRpYyBib29sIGV0aF9wb3J0X3dyaXRlX3NtaV9yZWcoRVRIX1BPUlQgZXRoX3BvcnRfbnVtLAorCQkJCSAgIHVuc2lnbmVkIGludCBwaHlfcmVnLAorCQkJCSAgIHVuc2lnbmVkIGludCB2YWx1ZSk7CisKK3N0YXRpYyBib29sIGV0aF9wb3J0X3JlYWRfc21pX3JlZyhFVEhfUE9SVCBldGhfcG9ydF9udW0sCisJCQkJICB1bnNpZ25lZCBpbnQgcGh5X3JlZywKKwkJCQkgIHVuc2lnbmVkIGludCogdmFsdWUpOworCitzdGF0aWMgdm9pZCBldGhfY2xlYXJfbWliX2NvdW50ZXJzKEVUSF9QT1JUCWV0aF9wb3J0X251bSk7CisKKy8qIFBvcnQgZGF0YSBmbG93IGNvbnRyb2wgcm91dGluZXMgKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3NlbmQgICAgKEVUSF9QT1JUX0lORk8gKnBfZXRoX3BvcnRfY3RybCwKKwkJCQkJICAgICBFVEhfUVVFVUUgdHhfcXVldWUsCisJCQkJCSAgICAgUEtUX0lORk8gKnBfcGt0X2luZm8pOworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3R4X3JldHVybl9kZXNjKEVUSF9QT1JUX0lORk8gKnBfZXRoX3BvcnRfY3RybCwKKwkJCQkJICAgICAgRVRIX1FVRVVFIHR4X3F1ZXVlLAorCQkJCQkgICAgICBQS1RfSU5GTyAqcF9wa3RfaW5mbyk7CitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9yZWNlaXZlIChFVEhfUE9SVF9JTkZPICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgRVRIX1FVRVVFIHJ4X3F1ZXVlLAorCQkJCQkgICAgIFBLVF9JTkZPICpwX3BrdF9pbmZvKTsKK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9yeF9yZXR1cm5fYnVmZihFVEhfUE9SVF9JTkZPICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJCSAgICAgIEVUSF9RVUVVRSByeF9xdWV1ZSwKKwkJCQkJICAgICAgUEtUX0lORk8gKnBfcGt0X2luZm8pOworCisKK3N0YXRpYyBib29sIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nKEVUSF9QT1JUX0lORk8gICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJICAgIEVUSF9RVUVVRQl0eF9xdWV1ZSwKKwkJCQkgICAgaW50CQkJCXR4X2Rlc2NfbnVtLAorCQkJCSAgICBpbnQJCQkJdHhfYnVmZl9zaXplLAorCQkJCSAgICB1bnNpZ25lZCBpbnQJdHhfZGVzY19iYXNlX2FkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludAl0eF9idWZmX2Jhc2VfYWRkcik7CisKK3N0YXRpYyBib29sIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nKEVUSF9QT1JUX0lORk8gICpwX2V0aF9wb3J0X2N0cmwsCisJCQkJICAgIEVUSF9RVUVVRQlyeF9xdWV1ZSwKKwkJCQkgICAgaW50CQkJCXJ4X2Rlc2NfbnVtLAorCQkJCSAgICBpbnQJCQkJcnhfYnVmZl9zaXplLAorCQkJCSAgICB1bnNpZ25lZCBpbnQJcnhfZGVzY19iYXNlX2FkZHIsCisJCQkJICAgIHVuc2lnbmVkIGludAlyeF9idWZmX2Jhc2VfYWRkcik7CisKKyNlbmRpZiAvKiBNVjY0NDYwX0VUSF8gKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC9tdl9yZWdzLmggYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvbXZfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvbXZfcmVncy5oCkBAIC0wLDAgKzEsMTEyNCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogSW5nbyBBc3NtdXMgPGluZ28uYXNzbXVzQGtleW1pbGUuY29tPgorICoKKyAqIGJhc2VkIG9uIC0gRHJpdmVyIGZvciBNVjY0NDYwWCBldGhlcm5ldCBwb3J0cworICogQ29weXJpZ2h0IChDKSAyMDAyIHJhYmVlaEBnYWxpbGVvLmNvLmlsCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGd0NjQ0NjByLmggLSBHVC02NDQ2MCBJbnRlcm5hbCByZWdpc3RlcnMgZGVmaW5pdGlvbiBmaWxlLgorKgorKiBERVNDUklQVElPTjoKKyoJTm9uZS4KKyoKKyogREVQRU5ERU5DSUVTOgorKglOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ212X3JlZ3NoCisjZGVmaW5lIF9fSU5DbXZfcmVnc2gKKworI2RlZmluZSBNVjY0NDYwCisKKy8qIFN1cHBvcnRlZCBieSB0aGUgQXRsYW50aXMgKi8KKyNkZWZpbmUgTVY2NDQ2MF9JTkNMVURFX1BDSV8xCisjZGVmaW5lIE1WNjQ0NjBfSU5DTFVERV9QQ0lfMF9BUkJJVEVSCisjZGVmaW5lIE1WNjQ0NjBfSU5DTFVERV9QQ0lfMV9BUkJJVEVSCisjZGVmaW5lIE1WNjQ0NjBfSU5DTFVERV9TTk9PUF9TVVBQT1JUCisjZGVmaW5lIE1WNjQ0NjBfSU5DTFVERV9QMlAKKyNkZWZpbmUgTVY2NDQ2MF9JTkNMVURFX0VUSF9QT1JUXzIKKyNkZWZpbmUgTVY2NDQ2MF9JTkNMVURFX0NQVV9NQVBQSU5HCisjZGVmaW5lIE1WNjQ0NjBfSU5DTFVERV9NUFNDCisKKy8qIE5vdCBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKyN1bmRlZglJTkNMVURFX0NOVE1SXzRfNworI3VuZGVmCUlOQ0xVREVfRE1BXzRfNworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByb2Nlc3NvciBBZGRyZXNzIFNwYWNlCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEREUiBTRFJBTSBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTVY2NDQ2MF9DU18wX0JBU0VfQUREUgkJCQkJICAgIDB4MDA4CisjZGVmaW5lIE1WNjQ0NjBfQ1NfMF9TSVpFCQkJCQkgICAgMHgwMTAKKyNkZWZpbmUgTVY2NDQ2MF9DU18xX0JBU0VfQUREUgkJCQkJICAgIDB4MjA4CisjZGVmaW5lIE1WNjQ0NjBfQ1NfMV9TSVpFCQkJCQkgICAgMHgyMTAKKyNkZWZpbmUgTVY2NDQ2MF9DU18yX0JBU0VfQUREUgkJCQkJICAgIDB4MDE4CisjZGVmaW5lIE1WNjQ0NjBfQ1NfMl9TSVpFCQkJCQkgICAgMHgwMjAKKyNkZWZpbmUgTVY2NDQ2MF9DU18zX0JBU0VfQUREUgkJCQkJICAgIDB4MjE4CisjZGVmaW5lIE1WNjQ0NjBfQ1NfM19TSVpFCQkJCQkgICAgMHgyMjAKKworLyogRGV2aWNlcyBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MwX0JBU0VfQUREUgkJCQkgICAgMHgwMjgKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MwX1NJWkUJCQkJCSAgICAweDAzMAorI2RlZmluZSBNVjY0NDYwX0RFVl9DUzFfQkFTRV9BRERSCQkJCSAgICAweDIyOAorI2RlZmluZSBNVjY0NDYwX0RFVl9DUzFfU0laRQkJCQkJICAgIDB4MjMwCisjZGVmaW5lIE1WNjQ0NjBfREVWX0NTMl9CQVNFX0FERFIJCQkJICAgIDB4MjQ4CisjZGVmaW5lIE1WNjQ0NjBfREVWX0NTMl9TSVpFCQkJCQkgICAgMHgyNTAKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MzX0JBU0VfQUREUgkJCQkgICAgMHgwMzgKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MzX1NJWkUJCQkJCSAgICAweDA0MAorI2RlZmluZSBNVjY0NDYwX0JPT1RDU19CQVNFX0FERFIJCQkJICAgIDB4MjM4CisjZGVmaW5lIE1WNjQ0NjBfQk9PVENTX1NJWkUJCQkJCSAgICAweDI0MAorCisvKiBQQ0kgMCBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9JT19CQVNFX0FERFIJCQkJICAgIDB4MDQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfSU9fU0laRQkJCQkJICAgIDB4MDUwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZMF9CQVNFX0FERFIJCQkJICAgIDB4MDU4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZMF9TSVpFCQkJCSAgICAweDA2MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTFfQkFTRV9BRERSCQkJCSAgICAweDA4MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTFfU0laRQkJCQkgICAgMHgwODgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9NRU1PUlkyX0JBU0VfQUREUgkJCQkgICAgMHgyNTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9NRU1PUlkyX1NJWkUJCQkJICAgIDB4MjYwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZM19CQVNFX0FERFIJCQkJICAgIDB4MjgwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZM19TSVpFCQkJCSAgICAweDI4OAorCisvKiBQQ0kgMSBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfSU9fQkFTRV9BRERSCQkJCSAgICAweDA5MAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0lPX1NJWkUJCQkJCSAgICAweDA5OAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTBfQkFTRV9BRERSCQkJCSAgICAweDBhMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTBfU0laRQkJCQkgICAgMHgwYTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9NRU1PUlkxX0JBU0VfQUREUgkJCQkgICAgMHgwYjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9NRU1PUlkxX1NJWkUJCQkJICAgIDB4MGI4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZMl9CQVNFX0FERFIJCQkJICAgIDB4MmEwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZMl9TSVpFCQkJCSAgICAweDJhOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTNfQkFTRV9BRERSCQkJCSAgICAweDJiMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTNfU0laRQkJCQkgICAgMHgyYjgKKworLyogU1JBTSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTVY2NDQ2MF9JTlRFR1JBVEVEX1NSQU1fQkFTRV9BRERSCQkJICAgIDB4MjY4CisKKy8qIGludGVybmFsIHJlZ2lzdGVycyBzcGFjZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTVY2NDQ2MF9JTlRFUk5BTF9TUEFDRV9CQVNFX0FERFIJCQkgICAgMHgwNjgKKworLyogRW5hYmxlcyB0aGUgQ1MgLCBERVZfQ1MgLCBQQ0kgMCBhbmQgUENJIDEKKyAgIHdpbmRvd3MgYWJvdmUgKi8KKyNkZWZpbmUgTVY2NDQ2MF9CQVNFX0FERFJfRU5BQkxFCQkJCSAgICAweDI3OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSByZW1hcCByZWdpc3RlcnMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiBQQ0kgMCAqLworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0lPX0FERFJfUkVNQVAJCQkJICAgIDB4MGYwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZMF9MT1dfQUREUl9SRU1BUAkJCSAgICAweDBmOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTBfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzIwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZMV9MT1dfQUREUl9SRU1BUAkJCSAgICAweDEwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTFfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzI4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZMl9MT1dfQUREUl9SRU1BUAkJCSAgICAweDJmOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTJfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzMwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTUVNT1JZM19MT1dfQUREUl9SRU1BUAkJCSAgICAweDMwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01FTU9SWTNfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzM4CisgICAgICAvKiBQQ0kgMSAqLworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0lPX0FERFJfUkVNQVAJCQkJICAgIDB4MTA4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZMF9MT1dfQUREUl9SRU1BUAkJCSAgICAweDExMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTBfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZMV9MT1dfQUREUl9SRU1BUAkJCSAgICAweDExOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTFfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZMl9MT1dfQUREUl9SRU1BUAkJCSAgICAweDMxMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTJfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzUwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTUVNT1JZM19MT1dfQUREUl9SRU1BUAkJCSAgICAweDMxOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01FTU9SWTNfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4MzU4CisKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfUENJXzBfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkgICAgMHgzYjAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfUENJXzBfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJICAgIDB4M2I4CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX1BDSV8xX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTAkJICAgIDB4M2MwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX1BDSV8xX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweDNjOAorI2RlZmluZSBNVjY0NDYwX0NQVV9HRV9IRUFERVJTX1JFVEFSR0VUX0NPTlRST0wJCQkgICAgMHgzZDAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfR0VfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJICAgIDB4M2Q4CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lETUFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkgICAgMHgzZTAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfSURNQV9IRUFERVJTX1JFVEFSR0VUX0JBU0UJCQkgICAgMHgzZTgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICBDUFUgQ29udHJvbCBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0NPTkZJRwkJCQkJICAgIDB4MDAwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX01PREUJCQkJCSAgICAweDEyMAorI2RlZmluZSBNVjY0NDYwX0NQVV9NQVNURVJfQ09OVFJPTAkJCQkgICAgMHgxNjAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkJICAgIDB4MTUwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCQkgICAgMHgxNTgKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJICAgIDB4MTY4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU01QIFJlZ2lzdGVyUwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1NNUF9XSE9fQU1fSQkJCQkJICAgIDB4MjAwCisjZGVmaW5lIE1WNjQ0NjBfU01QX0NQVTBfRE9PUkJFTEwJCQkJICAgIDB4MjE0CisjZGVmaW5lIE1WNjQ0NjBfU01QX0NQVTBfRE9PUkJFTExfQ0xFQVIJCQkJICAgIDB4MjFDCisjZGVmaW5lIE1WNjQ0NjBfU01QX0NQVTFfRE9PUkJFTEwJCQkJICAgIDB4MjI0CisjZGVmaW5lIE1WNjQ0NjBfU01QX0NQVTFfRE9PUkJFTExfQ0xFQVIJCQkJICAgIDB4MjJDCisjZGVmaW5lIE1WNjQ0NjBfU01QX0NQVTBfRE9PUkJFTExfTUFTSwkJCQkgICAgMHgyMzQKKyNkZWZpbmUgTVY2NDQ2MF9TTVBfQ1BVMV9ET09SQkVMTF9NQVNLCQkJCSAgICAweDIzQworI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjAJCQkJCSAgICAweDI0NAorI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjEJCQkJCSAgICAweDI0YworI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjIJCQkJCSAgICAweDI1NAorI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjMJCQkJCSAgICAweDI1YworI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjQJCQkJCSAgICAweDI2NAorI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjUJCQkJCSAgICAweDI2YworI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjYJCQkJCSAgICAweDI3NAorI2RlZmluZSBNVjY0NDYwX1NNUF9TRU1BUEhPUjcJCQkJCSAgICAweDI3YworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBDUFUgU3luYyBCYXJyaWVyIFJlZ2lzdGVyCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfMF9TWU5DX0JBUlJJRVJfVFJJR0dFUgkJCSAgICAweDBjMAorI2RlZmluZSBNVjY0NDYwX0NQVV8wX1NZTkNfQkFSUklFUl9WSVJUVUFMCQkJICAgIDB4MGM4CisjZGVmaW5lIE1WNjQ0NjBfQ1BVXzFfU1lOQ19CQVJSSUVSX1RSSUdHRVIJCQkgICAgMHgwZDAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfMV9TWU5DX0JBUlJJRVJfVklSVFVBTAkJCSAgICAweDBkOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENQVSBBY2Nlc3MgUHJvdGVjdAkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX0NQVV9QUk9URUNUX1dJTkRPV18wX0JBU0VfQUREUgkJCSAgICAweDE4MAorI2RlZmluZSBNVjY0NDYwX0NQVV9QUk9URUNUX1dJTkRPV18wX1NJWkUJCQkgICAgMHgxODgKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfUFJPVEVDVF9XSU5ET1dfMV9CQVNFX0FERFIJCQkgICAgMHgxOTAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfUFJPVEVDVF9XSU5ET1dfMV9TSVpFCQkJICAgIDB4MTk4CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX1BST1RFQ1RfV0lORE9XXzJfQkFTRV9BRERSCQkJICAgIDB4MWEwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX1BST1RFQ1RfV0lORE9XXzJfU0laRQkJCSAgICAweDFhOAorI2RlZmluZSBNVjY0NDYwX0NQVV9QUk9URUNUX1dJTkRPV18zX0JBU0VfQUREUgkJCSAgICAweDFiMAorI2RlZmluZSBNVjY0NDYwX0NQVV9QUk9URUNUX1dJTkRPV18zX1NJWkUJCQkgICAgMHgxYjgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBDUFUgRXJyb3IgUmVwb3J0CQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfRVJST1JfQUREUl9MT1cJCQkJICAgIDB4MDcwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0VSUk9SX0FERFJfSElHSAkJCQkgICAgMHgwNzgKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfRVJST1JfREFUQV9MT1cJCQkJICAgIDB4MTI4CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0VSUk9SX0RBVEFfSElHSAkJCQkgICAgMHgxMzAKKyNkZWZpbmUgTVY2NDQ2MF9DUFVfRVJST1JfUEFSSVRZCQkJCSAgICAweDEzOAorI2RlZmluZSBNVjY0NDYwX0NQVV9FUlJPUl9DQVVTRQkJCQkJICAgIDB4MTQwCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0VSUk9SX01BU0sJCQkJCSAgICAweDE0OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCUNQVSBJbnRlcmZhY2UgRGVidWcgUmVnaXN0ZXJzCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BVTklUX1NMQVZFX0RFQlVHX0xPVwkJCQkgICAgMHgzNjAKKyNkZWZpbmUgTVY2NDQ2MF9QVU5JVF9TTEFWRV9ERUJVR19ISUdICQkJCSAgICAweDM2OAorI2RlZmluZSBNVjY0NDYwX1BVTklUX01BU1RFUl9ERUJVR19MT1cJCQkJICAgIDB4MzcwCisjZGVmaW5lIE1WNjQ0NjBfUFVOSVRfTUFTVEVSX0RFQlVHX0hJR0gJCQkJICAgIDB4Mzc4CisjZGVmaW5lIE1WNjQ0NjBfUFVOSVRfTU1BU0sJCQkJCSAgICAweDNlNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJbnRlZ3JhdGVkIFNSQU0gUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9TUkFNX0NPTkZJRwkJCQkJICAgIDB4MzgwCisjZGVmaW5lIE1WNjQ0NjBfU1JBTV9URVNUX01PREUJCQkJCSAgICAwWDNGNAorI2RlZmluZSBNVjY0NDYwX1NSQU1fRVJST1JfQ0FVU0UJCQkJICAgIDB4Mzg4CisjZGVmaW5lIE1WNjQ0NjBfU1JBTV9FUlJPUl9BRERSCQkJCQkgICAgMHgzOTAKKyNkZWZpbmUgTVY2NDQ2MF9TUkFNX0VSUk9SX0FERFJfSElHSAkJCQkgICAgMFgzRjgKKyNkZWZpbmUgTVY2NDQ2MF9TUkFNX0VSUk9SX0RBVEFfTE9XCQkJCSAgICAweDM5OAorI2RlZmluZSBNVjY0NDYwX1NSQU1fRVJST1JfREFUQV9ISUdICQkJCSAgICAweDNhMAorI2RlZmluZSBNVjY0NDYwX1NSQU1fRVJST1JfREFUQV9QQVJJVFkJCQkJICAgIDB4M2E4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0RSQU0gQ29uZmlndXJhdGlvbgkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1NEUkFNX0NPTkZJRwkJCQkJICAgIDB4MTQwMAorI2RlZmluZSBNVjY0NDYwX0RfVU5JVF9DT05UUk9MX0xPVwkJCQkgICAgMHgxNDA0CisjZGVmaW5lIE1WNjQ0NjBfRF9VTklUX0NPTlRST0xfSElHSAkJCQkgICAgMHgxNDI0CisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fVElNSU5HX0NPTlRST0xfTE9XCQkJICAgIDB4MTQwOAorI2RlZmluZSBNVjY0NDYwX1NEUkFNX1RJTUlOR19DT05UUk9MX0hJR0gJCQkgICAgMHgxNDBjCisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fQUREUl9DT05UUk9MCQkJCSAgICAweDE0MTAKKyNkZWZpbmUgTVY2NDQ2MF9TRFJBTV9PUEVOX1BBR0VTX0NPTlRST0wJCQkgICAgMHgxNDE0CisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fT1BFUkFUSU9OCQkJCQkgICAgMHgxNDE4CisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fTU9ERQkJCQkJICAgIDB4MTQxYworI2RlZmluZSBNVjY0NDYwX0VYVEVOREVEX0RSQU1fTU9ERQkJCQkgICAgMHgxNDIwCisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkJICAgIDB4MTQzMAorI2RlZmluZSBNVjY0NDYwX1NEUkFNX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCQkgICAgMHgxNDM0CisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fQ1JPU1NfQkFSX1RJTUVPVVQJCQkJICAgIDB4MTQzOAorI2RlZmluZSBNVjY0NDYwX1NEUkFNX0FERFJfQ1RSTF9QQURTX0NBTElCUkFUSU9OCQkgICAgMHgxNGMwCisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fREFUQV9QQURTX0NBTElCUkFUSU9OCQkJICAgIDB4MTRjNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNEUkFNIEVycm9yIFJlcG9ydAkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1NEUkFNX0VSUk9SX0RBVEFfTE9XCQkJCSAgICAweDE0NDQKKyNkZWZpbmUgTVY2NDQ2MF9TRFJBTV9FUlJPUl9EQVRBX0hJR0gJCQkJICAgIDB4MTQ0MAorI2RlZmluZSBNVjY0NDYwX1NEUkFNX0VSUk9SX0FERFIJCQkJICAgIDB4MTQ1MAorI2RlZmluZSBNVjY0NDYwX1NEUkFNX1JFQ0VJVkVEX0VDQwkJCQkgICAgMHgxNDQ4CisjZGVmaW5lIE1WNjQ0NjBfU0RSQU1fQ0FMQ1VMQVRFRF9FQ0MJCQkJICAgIDB4MTQ0YworI2RlZmluZSBNVjY0NDYwX1NEUkFNX0VDQ19DT05UUk9MCQkJCSAgICAweDE0NTQKKyNkZWZpbmUgTVY2NDQ2MF9TRFJBTV9FQ0NfRVJST1JfQ09VTlRFUgkJCQkgICAgMHgxNDU4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgQ29udHJvbGxlZCBEZWxheSBMaW5lIChDREwpIFJlZ2lzdGVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX0RGQ0RMX0NPTkZJRzAJCQkJCSAgICAweDE0ODAKKyNkZWZpbmUgTVY2NDQ2MF9ERkNETF9DT05GSUcxCQkJCQkgICAgMHgxNDg0CisjZGVmaW5lIE1WNjQ0NjBfRExMX1dSSVRFCQkJCQkgICAgMHgxNDg4CisjZGVmaW5lIE1WNjQ0NjBfRExMX1JFQUQJCQkJCSAgICAweDE0OGMKKyNkZWZpbmUgTVY2NDQ2MF9TUkFNX0FERFIJCQkJCSAgICAweDE0OTAKKyNkZWZpbmUgTVY2NDQ2MF9TUkFNX0RBVEEwCQkJCQkgICAgMHgxNDk0CisjZGVmaW5lIE1WNjQ0NjBfU1JBTV9EQVRBMQkJCQkJICAgIDB4MTQ5OAorI2RlZmluZSBNVjY0NDYwX1NSQU1fREFUQTIJCQkJCSAgICAweDE0OWMKKyNkZWZpbmUgTVY2NDQ2MF9ERkNMX1BST0JFCQkJCQkgICAgMHgxNGEwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIERlYnVnIFJlZ2lzdGVycwkJCSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9EVU5JVF9ERUJVR19MT1cJCQkJCSAgICAweDE0NjAKKyNkZWZpbmUgTVY2NDQ2MF9EVU5JVF9ERUJVR19ISUdICQkJCSAgICAweDE0NjQKKyNkZWZpbmUgTVY2NDQ2MF9EVU5JVF9NTUFTSwkJCQkJICAgIDBYMWI0MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERldmljZSBQYXJhbWV0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0JBTkswX1BBUkFNRVRFUlMJCQkJICAgIDB4NDVjCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0JBTksxX1BBUkFNRVRFUlMJCQkJICAgIDB4NDYwCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0JBTksyX1BBUkFNRVRFUlMJCQkJICAgIDB4NDY0CisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0JBTkszX1BBUkFNRVRFUlMJCQkJICAgIDB4NDY4CisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0JPT1RfQkFOS19QQVJBTUVURVJTCQkJICAgIDB4NDZjCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0lOVEVSRkFDRV9DT05UUk9MCQkJICAgIDB4NGMwCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0lOVEVSRkFDRV9DUk9TU19CQVJfQ09OVFJPTF9MT1cJCSAgICAweDRjOAorI2RlZmluZSBNVjY0NDYwX0RFVklDRV9JTlRFUkZBQ0VfQ1JPU1NfQkFSX0NPTlRST0xfSElHSAkJICAgIDB4NGNjCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0lOVEVSRkFDRV9DUk9TU19CQVJfVElNRU9VVAkJICAgIDB4NGM0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIGludGVycnVwdCByZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX0RFVklDRV9JTlRFUlJVUFRfQ0FVU0UJCQkJICAgIDB4NGQwCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0lOVEVSUlVQVF9NQVNLCQkJCSAgICAweDRkNAorI2RlZmluZSBNVjY0NDYwX0RFVklDRV9FUlJPUl9BRERSCQkJCSAgICAweDRkOAorI2RlZmluZSBNVjY0NDYwX0RFVklDRV9FUlJPUl9EQVRBCQkJCSAgICAweDRkYworI2RlZmluZSBNVjY0NDYwX0RFVklDRV9FUlJPUl9QQVJJVFkJCQkJICAgIDB4NGUwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIGRlYnVnIHJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfREVWSUNFX0RFQlVHX0xPVwkJCQkgICAgMHg0ZTQKKyNkZWZpbmUgTVY2NDQ2MF9ERVZJQ0VfREVCVUdfSElHSAkJCQkgICAgMHg0ZTgKKyNkZWZpbmUgTVY2NDQ2MF9SVU5JVF9NTUFTSwkJCQkJICAgIDB4NGYwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIFNsYXZlIEFkZHJlc3MgRGVjb2RpbmcgcmVnaXN0ZXJzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzBfQkFOS19TSVpFCQkJCSAgICAweGMwOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzBfQkFOS19TSVpFCQkJCSAgICAweGM4OAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzFfQkFOS19TSVpFCQkJCSAgICAweGQwOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzFfQkFOS19TSVpFCQkJCSAgICAweGQ4OAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzJfQkFOS19TSVpFCQkJCSAgICAweGMwYworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzJfQkFOS19TSVpFCQkJCSAgICAweGM4YworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzNfQkFOS19TSVpFCQkJCSAgICAweGQwYworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzNfQkFOS19TSVpFCQkJCSAgICAweGQ4YworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzBfQkFOS19TSVpFCQkJCSAgICAweGMxMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RFVkNTXzBfQkFOS19TSVpFCQkJCSAgICAweGM5MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzFfQkFOS19TSVpFCQkJCSAgICAweGQxMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RFVkNTXzFfQkFOS19TSVpFCQkJCSAgICAweGQ5MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzJfQkFOS19TSVpFCQkJCSAgICAweGQxOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RFVkNTXzJfQkFOS19TSVpFCQkJCSAgICAweGQ5OAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzNfQkFOS19TSVpFCQkJCSAgICAweGMxNAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RFVkNTXzNfQkFOS19TSVpFCQkJCSAgICAweGM5NAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTX0JPT1RfQkFOS19TSVpFCQkJICAgIDB4ZDE0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfREVWQ1NfQk9PVF9CQU5LX1NJWkUJCQkgICAgMHhkOTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9QMlBfTUVNMF9CQVJfU0laRQkJCQkgICAgMHhkMWMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9QMlBfTUVNMF9CQVJfU0laRQkJCQkgICAgMHhkOWMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9QMlBfTUVNMV9CQVJfU0laRQkJCQkgICAgMHhkMjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9QMlBfTUVNMV9CQVJfU0laRQkJCQkgICAgMHhkYTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9QMlBfSV9PX0JBUl9TSVpFCQkJCSAgICAweGQyNAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX1AyUF9JX09fQkFSX1NJWkUJCQkJICAgIDB4ZGE0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQ1BVX0JBUl9TSVpFCQkJCSAgICAweGQyOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NQVV9CQVJfU0laRQkJCQkgICAgMHhkYTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9JTlRFUk5BTF9TUkFNX0JBUl9TSVpFCQkJICAgIDB4ZTAwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfSU5URVJOQUxfU1JBTV9CQVJfU0laRQkJCSAgICAweGU4MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0VYUEFOU0lPTl9ST01fQkFSX1NJWkUJCQkgICAgMHhkMmMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9FWFBBTlNJT05fUk9NX0JBUl9TSVpFCQkJICAgIDB4ZDljCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQkFTRV9BRERSX1JFR19FTkFCTEUJCQkgICAgMHhjM2MKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9CQVNFX0FERFJfUkVHX0VOQUJMRQkJCSAgICAweGNiYworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzBfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4YzQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQ1NfMF9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhjYzgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DU18xX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGQ0OAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzFfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZGM4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQ1NfMl9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhjNGMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9DU18yX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGNjYworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzNfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZDRjCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQ1NfM19CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkY2MKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DU18wX0JBU0VfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4RjA0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQ1NfMF9CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEY4NAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NTXzFfQkFTRV9ISUdIX0FERFJfUkVNQVAJCQkgICAgMHhGMDgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9DU18xX0JBU0VfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4Rjg4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQ1NfMl9CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEYwQworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NTXzJfQkFTRV9ISUdIX0FERFJfUkVNQVAJCQkgICAgMHhGOEMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DU18zX0JBU0VfSElHSF9BRERSX1JFTUFQCQkJICAgIDB4RjEwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQ1NfM19CQVNFX0hJR0hfQUREUl9SRU1BUAkJCSAgICAweEY5MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzBfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4YzUwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfREVWQ1NfMF9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhjZDAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9ERVZDU18xX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGQ1MAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RFVkNTXzFfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4ZGQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfREVWQ1NfMl9CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkNTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9ERVZDU18yX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGRkOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0RFVkNTXzNfQkFTRV9BRERSX1JFTUFQCQkJICAgIDB4YzU0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfREVWQ1NfM19CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhjZDQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9ERVZDU19CT09UQ1NfQkFTRV9BRERSX1JFTUFQCQkgICAgMHhkNTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9ERVZDU19CT09UQ1NfQkFTRV9BRERSX1JFTUFQCQkgICAgMHhkZDQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9QMlBfTUVNMF9CQVNFX0FERFJfUkVNQVBfTE9XCQkgICAgMHhkNWMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9QMlBfTUVNMF9CQVNFX0FERFJfUkVNQVBfTE9XCQkgICAgMHhkZGMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9QMlBfTUVNMF9CQVNFX0FERFJfUkVNQVBfSElHSAkJICAgIDB4ZDYwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0hJR0gJCSAgICAweGRlMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX1AyUF9NRU0xX0JBU0VfQUREUl9SRU1BUF9MT1cJCSAgICAweGQ2NAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX1AyUF9NRU0xX0JBU0VfQUREUl9SRU1BUF9MT1cJCSAgICAweGRlNAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX1AyUF9NRU0xX0JBU0VfQUREUl9SRU1BUF9ISUdICQkgICAgMHhkNjgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9QMlBfTUVNMV9CQVNFX0FERFJfUkVNQVBfSElHSAkJICAgIDB4ZGU4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfUDJQX0lfT19CQVNFX0FERFJfUkVNQVAJCQkgICAgMHhkNmMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9QMlBfSV9PX0JBU0VfQUREUl9SRU1BUAkJCSAgICAweGRlYworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NQVV9CQVNFX0FERFJfUkVNQVBfTE9XCQkJICAgIDB4ZDcwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQ1BVX0JBU0VfQUREUl9SRU1BUF9MT1cJCQkgICAgMHhkZjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DUFVfQkFTRV9BRERSX1JFTUFQX0hJR0gJCQkgICAgMHhkNzQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9DUFVfQkFTRV9BRERSX1JFTUFQX0hJR0gJCQkgICAgMHhkZjQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9JTlRFR1JBVEVEX1NSQU1fQkFTRV9BRERSX1JFTUFQCQkgICAgMHhmMDAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9JTlRFR1JBVEVEX1NSQU1fQkFTRV9BRERSX1JFTUFQCQkgICAgMHhmODAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9FWFBBTlNJT05fUk9NX0JBU0VfQUREUl9SRU1BUAkJICAgIDB4ZjM4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfRVhQQU5TSU9OX1JPTV9CQVNFX0FERFJfUkVNQVAJCSAgICAweGZiOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FERFJfREVDT0RFX0NPTlRST0wJCQkgICAgMHhkM2MKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BRERSX0RFQ09ERV9DT05UUk9MCQkJICAgIDB4ZGJjCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJICAgIDB4RjQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJICAgIDB4RmMwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJICAgIDB4RjQ0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJICAgIDB4RmM0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfSEVBREVSU19SRVRBUkdFVF9ISUdICQkJICAgIDB4RjQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfSEVBREVSU19SRVRBUkdFVF9ISUdICQkJICAgIDB4RmM4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIENvbnRyb2wgUmVnaXN0ZXIgTWFwCSAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9ETExfU1RBVFVTX0FORF9DT01NQU5ECQkJICAgIDB4MWQyMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0RMTF9TVEFUVVNfQU5EX0NPTU1BTkQJCQkgICAgMHgxZGEwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfTVBQX1BBRFNfRFJJVkVfQ09OVFJPTAkJCSAgICAweDFkMUMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9NUFBfUEFEU19EUklWRV9DT05UUk9MCQkJICAgIDB4MWQ5QworI2RlZmluZSBNVjY0NDYwX1BDSV8wX0NPTU1BTkQJCQkJCSAgICAweGMwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NPTU1BTkQJCQkJCSAgICAweGM4MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX01PREUJCQkJCSAgICAweGQwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX01PREUJCQkJCSAgICAweGQ4MAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX1JFVFJZCQkJCQkgICAgMHhjMDQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9SRVRSWQkJCQkJICAgIDB4Yzg0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfUkVBRF9CVUZGRVJfRElTQ0FSRF9USU1FUgkJCSAgICAweGQwNAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX1JFQURfQlVGRkVSX0RJU0NBUkRfVElNRVIJCQkgICAgMHhkODQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9NU0lfVFJJR0dFUl9USU1FUgkJCQkgICAgMHhjMzgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9NU0lfVFJJR0dFUl9USU1FUgkJCQkgICAgMHhjYjgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BUkJJVEVSX0NPTlRST0wJCQkJICAgIDB4MWQwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FSQklURVJfQ09OVFJPTAkJCQkgICAgMHgxZDgwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkJICAgIDB4MWQwOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCSAgICAweDFkODgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgIDB4MWQwYworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCQkgICAgMHgxZDhjCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJICAgIDB4MWQwNAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NST1NTX0JBUl9USU1FT1VUCQkJCSAgICAweDFkODQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9TWU5DX0JBUlJJRVJfVFJJR0dFUl9SRUcJCQkgICAgMHgxRDE4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfU1lOQ19CQVJSSUVSX1RSSUdHRVJfUkVHCQkJICAgIDB4MUQ5OAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX1NZTkNfQkFSUklFUl9WSVJUVUFMX1JFRwkJCSAgICAweDFkMTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9TWU5DX0JBUlJJRVJfVklSVFVBTF9SRUcJCQkgICAgMHgxZDkwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfUDJQX0NPTkZJRwkJCQkgICAgMHgxZDE0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfUDJQX0NPTkZJRwkJCQkgICAgMHgxZDk0CisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCQkJICAgIDB4MWUwMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMF9ISUdICQkgICAgMHgxZTA0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV8wCQkJICAgIDB4MWUwOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMV9MT1cJCQkgICAgMHgxZTEwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8xX0hJR0gJCSAgICAweDFlMTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzEJCQkgICAgMHgxZTE4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8yX0xPVwkJCSAgICAweDFlMjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzJfSElHSAkJICAgIDB4MWUyNAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfMgkJCSAgICAweDFlMjgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzNfTE9XCQkJICAgIDB4MWUzMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfM19ISUdICQkgICAgMHgxZTM0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV8zCQkJICAgIDB4MWUzOAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfNF9MT1cJCQkgICAgMHgxZTQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV80X0hJR0gJCSAgICAweDFlNDQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzQJCQkgICAgMHgxZTQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV81X0xPVwkJCSAgICAweDFlNTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzVfSElHSAkJICAgIDB4MWU1NAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfNQkJCSAgICAweDFlNTgKKworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMF9MT1cJCQkgICAgMHgxZTgwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8wX0hJR0gJCSAgICAweDFlODQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzAJCQkgICAgMHgxZTg4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8xX0xPVwkJCSAgICAweDFlOTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzFfSElHSAkJICAgIDB4MWU5NAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfMQkJCSAgICAweDFlOTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzJfTE9XCQkJICAgIDB4MWVhMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMl9ISUdICQkgICAgMHgxZWE0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV8yCQkJICAgIDB4MWVhOAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfM19MT1cJCQkgICAgMHgxZWIwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8zX0hJR0gJCSAgICAweDFlYjQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzMJCQkgICAgMHgxZWI4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV80X0xPVwkJCSAgICAweDFlYzAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzRfSElHSAkJICAgIDB4MWVjNAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfNAkJCSAgICAweDFlYzgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzVfTE9XCQkJICAgIDB4MWVkMAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfNV9ISUdICQkgICAgMHgxZWQ0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV81CQkJICAgIDB4MWVkOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIENvbmZpZ3VyYXRpb24gQWNjZXNzIFJlZ2lzdGVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DT05GSUdfQUREUgkJCQkgICAgMHhjZjgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9DT05GSUdfREFUQV9WSVJUVUFMX1JFRwkJCSAgICAweGNmYworI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NPTkZJR19BRERSCQkJCSAgICAweGM3OAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHCQkJICAgIDB4YzdjCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfSU5URVJSVVBUX0FDS05PV0xFREdFX1ZJUlRVQUxfUkVHCQkgICAgMHhjMzQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9JTlRFUlJVUFRfQUNLTk9XTEVER0VfVklSVFVBTF9SRUcJCSAgICAweGNiNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIEVycm9yIFJlcG9ydCBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BDSV8wX1NFUlJfTUFTSwkJCQkJICAgIDB4YzI4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfU0VSUl9NQVNLCQkJCQkgICAgMHhjYTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9FUlJPUl9BRERSX0xPVwkJCQkgICAgMHgxZDQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfRVJST1JfQUREUl9MT1cJCQkJICAgIDB4MWRjMAorI2RlZmluZSBNVjY0NDYwX1BDSV8wX0VSUk9SX0FERFJfSElHSAkJCQkgICAgMHgxZDQ0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfRVJST1JfQUREUl9ISUdICQkJCSAgICAweDFkYzQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9FUlJPUl9BVFRSSUJVVEUJCQkJICAgIDB4MWQ0OAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0VSUk9SX0FUVFJJQlVURQkJCQkgICAgMHgxZGM4CisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfRVJST1JfQ09NTUFORAkJCQkgICAgMHgxZDUwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfRVJST1JfQ09NTUFORAkJCQkgICAgMHgxZGQwCisjZGVmaW5lIE1WNjQ0NjBfUENJXzBfRVJST1JfQ0FVU0UJCQkJICAgIDB4MWQ1OAorI2RlZmluZSBNVjY0NDYwX1BDSV8xX0VSUk9SX0NBVVNFCQkJCSAgICAweDFkZDgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9FUlJPUl9NQVNLCQkJCSAgICAweDFkNWMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9FUlJPUl9NQVNLCQkJCSAgICAweDFkZGMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBEZWJ1ZyBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BDSV8wX01NQVNLCQkJCQkgICAgMFgxRDI0CisjZGVmaW5lIE1WNjQ0NjBfUENJXzFfTU1BU0sJCQkJCSAgICAwWDFEQTQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBDb25maWd1cmF0aW9uLCBGdW5jdGlvbiAwLCBSZWdpc3RlcnMgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfUENJX0RFVklDRV9BTkRfVkVORE9SX0lECQkJICAgIDB4MDAwCisjZGVmaW5lIE1WNjQ0NjBfUENJX1NUQVRVU19BTkRfQ09NTUFORAkJCQkgICAgMHgwMDQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfQ0xBU1NfQ09ERV9BTkRfUkVWSVNJT05fSUQJCQkgICAgMHgwMDgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfQklTVF9IRUFERVJfVFlQRV9MQVRFTkNZX1RJTUVSX0NBQ0hFX0xJTkUJICAgIDB4MDBDCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfU0NTXzBfQkFTRV9BRERSX0xPVwkJCQkgICAgMHgwMTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfU0NTXzBfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgwMTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfU0NTXzFfQkFTRV9BRERSX0xPVwkJCQkgICAgMHgwMTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfU0NTXzFfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgwMUMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfSU5URVJOQUxfUkVHX01FTV9NQVBQRURfQkFTRV9BRERSX0xPVwkgICAgMHgwMjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfSU5URVJOQUxfUkVHX01FTV9NQVBQRURfQkFTRV9BRERSX0hJR0gJICAgIDB4MDI0CisjZGVmaW5lIE1WNjQ0NjBfUENJX1NVQlNZU1RFTV9JRF9BTkRfU1VCU1lTVEVNX1ZFTkRPUl9JRAkgICAgMHgwMmMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfRVhQQU5TSU9OX1JPTV9CQVNFX0FERFJfUkVHCQkJICAgIDB4MDMwCisjZGVmaW5lIE1WNjQ0NjBfUENJX0NBUEFCSUxUWV9MSVNUX1BPSU5URVIJCQkgICAgMHgwMzQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfSU5URVJSVVBUX1BJTl9BTkRfTElORQkJCSAgICAweDAzQworICAgICAgIC8qIGNhcGFiaWxpdHkgbGlzdCAqLworI2RlZmluZSBNVjY0NDYwX1BDSV9QT1dFUl9NQU5BR0VNRU5UX0NBUEFCSUxJVFkJCQkgICAgMHgwNDAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfUE9XRVJfTUFOQUdFTUVOVF9TVEFUVVNfQU5EX0NPTlRST0wJCSAgICAweDA0NAorI2RlZmluZSBNVjY0NDYwX1BDSV9WUERfQUREUgkJCQkJICAgIDB4MDQ4CisjZGVmaW5lIE1WNjQ0NjBfUENJX1ZQRF9EQVRBCQkJCQkgICAgMHgwNGMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfTVNJX01FU1NBR0VfQ09OVFJPTAkJCQkgICAgMHgwNTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfTVNJX01FU1NBR0VfQUREUgkJCQkgICAgMHgwNTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfTVNJX01FU1NBR0VfVVBQRVJfQUREUgkJCSAgICAweDA1OAorI2RlZmluZSBNVjY0NDYwX1BDSV9NU0lfTUVTU0FHRV9EQVRBCQkJCSAgICAweDA1YworI2RlZmluZSBNVjY0NDYwX1BDSV9YX0NPTU1BTkQJCQkJCSAgICAweDA2MAorI2RlZmluZSBNVjY0NDYwX1BDSV9YX1NUQVRVUwkJCQkJICAgIDB4MDY0CisjZGVmaW5lIE1WNjQ0NjBfUENJX0NPTVBBQ1RfUENJX0hPVF9TV0FQCQkJICAgIDB4MDY4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDEsIFJlZ2lzdGVycyAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BDSV9TQ1NfMl9CQVNFX0FERFJfTE9XCQkJCSAgICAweDExMAorI2RlZmluZSBNVjY0NDYwX1BDSV9TQ1NfMl9CQVNFX0FERFJfSElHSAkJCSAgICAweDExNAorI2RlZmluZSBNVjY0NDYwX1BDSV9TQ1NfM19CQVNFX0FERFJfTE9XCQkJCSAgICAweDExOAorI2RlZmluZSBNVjY0NDYwX1BDSV9TQ1NfM19CQVNFX0FERFJfSElHSAkJCSAgICAweDExYworI2RlZmluZSBNVjY0NDYwX1BDSV9JTlRFUk5BTF9TUkFNX0JBU0VfQUREUl9MT1cJCQkgICAgMHgxMjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfSU5URVJOQUxfU1JBTV9CQVNFX0FERFJfSElHSAkJICAgIDB4MTI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQQ0kgQ29uZmlndXJhdGlvbiwgRnVuY3Rpb24gMiwgUmVnaXN0ZXJzICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX1BDSV9ERVZDU18wX0JBU0VfQUREUl9MT1cJCQkgICAgMHgyMTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfREVWQ1NfMF9CQVNFX0FERFJfSElHSAkJCSAgICAweDIxNAorI2RlZmluZSBNVjY0NDYwX1BDSV9ERVZDU18xX0JBU0VfQUREUl9MT1cJCQkgICAgMHgyMTgKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfREVWQ1NfMV9CQVNFX0FERFJfSElHSAkJCSAgICAweDIxYworI2RlZmluZSBNVjY0NDYwX1BDSV9ERVZDU18yX0JBU0VfQUREUl9MT1cJCQkgICAgMHgyMjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfREVWQ1NfMl9CQVNFX0FERFJfSElHSAkJCSAgICAweDIyNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDMsIFJlZ2lzdGVycyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfREVWQ1NfM19CQVNFX0FERFJfTE9XCQkJICAgIDB4MzEwCisjZGVmaW5lIE1WNjQ0NjBfUENJX0RFVkNTXzNfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgzMTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfQk9PVF9DU19CQVNFX0FERFJfTE9XCQkJICAgIDB4MzE4CisjZGVmaW5lIE1WNjQ0NjBfUENJX0JPT1RfQ1NfQkFTRV9BRERSX0hJR0gJCQkgICAgMHgzMWMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfQ1BVX0JBU0VfQUREUl9MT1cJCQkJICAgIDB4MjIwCisjZGVmaW5lIE1WNjQ0NjBfUENJX0NQVV9CQVNFX0FERFJfSElHSAkJCQkgICAgMHgyMjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFBDSSBDb25maWd1cmF0aW9uLCBGdW5jdGlvbiA0LCBSZWdpc3RlcnMgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfUENJX1AyUF9NRU0wX0JBU0VfQUREUl9MT1cJCQkgICAgMHg0MTAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfUDJQX01FTTBfQkFTRV9BRERSX0hJR0gJCQkgICAgMHg0MTQKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfUDJQX01FTTFfQkFTRV9BRERSX0xPVwkJCSAgICAweDQxOAorI2RlZmluZSBNVjY0NDYwX1BDSV9QMlBfTUVNMV9CQVNFX0FERFJfSElHSAkJCSAgICAweDQxYworI2RlZmluZSBNVjY0NDYwX1BDSV9QMlBfSV9PX0JBU0VfQUREUgkJCQkgICAgMHg0MjAKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfSU5URVJOQUxfUkVHU19JX09fTUFQUEVEX0JBU0VfQUREUgkJICAgIDB4NDI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVzc2FnaW5nIFVuaXQgUmVnaXN0ZXJzIChJMjApCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMF9TSURFCQkgICAgMHgwMTAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9NRVNTQUdFX1JFRzFfUENJXzBfU0lERQkJICAgIDB4MDE0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMF9TSURFCQkgICAgMHgwMTgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcxX1BDSV8wX1NJREUJCSAgICAweDAxQworI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMF9TSURFCQkgICAgMHgwMjAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8wX1NJREUJICAgIDB4MDI0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX1BDSV8wX1NJREUJICAgIDB4MDI4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMF9TSURFCQkgICAgMHgwMkMKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19QQ0lfMF9TSURFCSAgICAweDAzMAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfUENJXzBfU0lERQkgICAgMHgwMzQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX1BDSV8wX1NJREUJICAgIDB4MDQwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfUENJXzBfU0lERQkgICAgMHgwNDQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fUVVFVUVfQ09OVFJPTF9SRUdfUENJXzBfU0lERQkJICAgIDB4MDUwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX1FVRVVFX0JBU0VfQUREUl9SRUdfUENJXzBfU0lERQkJICAgIDB4MDU0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MDYwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MDY0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MDY4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MDZDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDA3MAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkgICAgMHgwNzQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJICAgIDB4MEY4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCSAgICAweDBGQworCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcwX1BDSV8xX1NJREUJCSAgICAweDA5MAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMV9QQ0lfMV9TSURFCQkgICAgMHgwOTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcwX1BDSV8xX1NJREUJCSAgICAweDA5OAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfUENJXzFfU0lERQkJICAgIDB4MDlDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRE9PUkJFTExfUkVHX1BDSV8xX1NJREUJCSAgICAweDBBMAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfUENJXzFfU0lERQkgICAgMHgwQTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfUENJXzFfU0lERQkgICAgMHgwQTgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfRE9PUkJFTExfUkVHX1BDSV8xX1NJREUJCSAgICAweDBBQworI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8xX1NJREUJICAgIDB4MEIwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19QQ0lfMV9TSURFCSAgICAweDBCNAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfUENJXzFfU0lERQkgICAgMHgwQzAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMV9TSURFCSAgICAweDBDNAorI2RlZmluZSBNVjY0NDYwX0kyT19RVUVVRV9DT05UUk9MX1JFR19QQ0lfMV9TSURFCQkgICAgMHgwRDAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fUVVFVUVfQkFTRV9BRERSX1JFR19QQ0lfMV9TSURFCQkgICAgMHgwRDQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwRTAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwRTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwRTgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwRUMKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MEYwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCSAgICAweDBGNAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkgICAgMHgwNzgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJICAgIDB4MDdDCisKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9NRVNTQUdFX1JFRzBfQ1BVMF9TSURFCQkgICAgMHgxQzEwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcxX0NQVTBfU0lERQkJICAgIDB4MUMxNAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9NRVNTQUdFX1JFRzBfQ1BVMF9TSURFCQkgICAgMHgxQzE4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMV9DUFUwX1NJREUJCSAgICAweDFDMUMKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9ET09SQkVMTF9SRUdfQ1BVMF9TSURFCQkgICAgMHgxQzIwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19DUFUwX1NJREUJICAgIDB4MUMyNAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19DUFUwX1NJREUJICAgIDB4MUMyOAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9ET09SQkVMTF9SRUdfQ1BVMF9TSURFCQkgICAgMHgxQzJDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfQ1BVMF9TSURFCSAgICAweDFDMzAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX0NQVTBfU0lERQkgICAgMHgxQzM0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19DUFUwX1NJREUJICAgIDB4MUM0MAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX0NQVTBfU0lERQkgICAgMHgxQzQ0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX1FVRVVFX0NPTlRST0xfUkVHX0NQVTBfU0lERQkJCSAgICAweDFDNTAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fUVVFVUVfQkFTRV9BRERSX1JFR19DUFUwX1NJREUJCSAgICAweDFDNTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDNjAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDNjQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDNjgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDNkMKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQzcwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19DUFUwX1NJREUJICAgIDB4MUM3NAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCSAgICAweDFDRjgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX0NQVTBfU0lERQkgICAgMHgxQ0ZDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcwX0NQVTFfU0lERQkJICAgIDB4MUM5MAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX01FU1NBR0VfUkVHMV9DUFUxX1NJREUJCSAgICAweDFDOTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcwX0NQVTFfU0lERQkJICAgIDB4MUM5OAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfQ1BVMV9TSURFCQkgICAgMHgxQzlDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRE9PUkJFTExfUkVHX0NQVTFfU0lERQkJICAgIDB4MUNBMAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfQ1BVMV9TSURFCSAgICAweDFDQTQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fSU5CT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfQ1BVMV9TSURFCSAgICAweDFDQTgKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfRE9PUkJFTExfUkVHX0NQVTFfU0lERQkJICAgIDB4MUNBQworI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0IwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19DUFUxX1NJREUJICAgIDB4MUNCNAorI2RlZmluZSBNVjY0NDYwX0kyT19JTkJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfQ1BVMV9TSURFCSAgICAweDFDQzAKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19DUFUxX1NJREUJICAgIDB4MUNDNAorI2RlZmluZSBNVjY0NDYwX0kyT19RVUVVRV9DT05UUk9MX1JFR19DUFUxX1NJREUJCQkgICAgMHgxQ0QwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX1FVRVVFX0JBU0VfQUREUl9SRUdfQ1BVMV9TSURFCQkgICAgMHgxQ0Q0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0UwCisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0U0CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0U4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX0lOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQ0VDCisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUNGMAorI2RlZmluZSBNVjY0NDYwX0kyT19PVVRCT1VORF9GUkVFX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCSAgICAweDFDRjQKKyNkZWZpbmUgTVY2NDQ2MF9JMk9fT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX0NQVTFfU0lERQkgICAgMHgxQzc4CisjZGVmaW5lIE1WNjQ0NjBfSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19DUFUxX1NJREUJICAgIDB4MUM3QworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgRXRoZXJuZXQgVW5pdCBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX0VUSF9QSFlfQUREUl9SRUcJCQkJICAgIDB4MjAwMAorI2RlZmluZSBNVjY0NDYwX0VUSF9TTUlfUkVHCQkJCQkgICAgMHgyMDA0CisjZGVmaW5lIE1WNjQ0NjBfRVRIX1VOSVRfREVGQVVMVF9BRERSX1JFRwkJCSAgICAweDIwMDgKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVU5JVF9ERUZBVUxUSURfUkVHCQkJCSAgICAweDIwMGMKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVU5JVF9JTlRFUlJVUFRfQ0FVU0VfUkVHCQkJICAgIDB4MjA4MAorI2RlZmluZSBNVjY0NDYwX0VUSF9VTklUX0lOVEVSUlVQVF9NQVNLX1JFRwkJCSAgICAweDIwODQKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVU5JVF9JTlRFUk5BTF9VU0VfUkVHCQkJICAgIDB4MjRmYworI2RlZmluZSBNVjY0NDYwX0VUSF9VTklUX0VSUk9SX0FERFJfUkVHCQkJCSAgICAweDIwOTQKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzAJCQkJCSAgICAweDIyMDAKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzEJCQkJCSAgICAweDIyMDgKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzIJCQkJCSAgICAweDIyMTAKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzMJCQkJCSAgICAweDIyMTgKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzQJCQkJCSAgICAweDIyMjAKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQkFSXzUJCQkJCSAgICAweDIyMjgKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfU0laRV9SRUdfMAkJCQkJICAgIDB4MjIwNAorI2RlZmluZSBNVjY0NDYwX0VUSF9TSVpFX1JFR18xCQkJCQkgICAgMHgyMjBjCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1NJWkVfUkVHXzIJCQkJCSAgICAweDIyMTQKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfU0laRV9SRUdfMwkJCQkJICAgIDB4MjIxYworI2RlZmluZSBNVjY0NDYwX0VUSF9TSVpFX1JFR180CQkJCQkgICAgMHgyMjI0CisjZGVmaW5lIE1WNjQ0NjBfRVRIX1NJWkVfUkVHXzUJCQkJCSAgICAweDIyMmMKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfSEVBREVSU19SRVRBUkdFVF9CQVNFX1JFRwkJCSAgICAweDIyMzAKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MX1JFRwkJICAgIDB4MjIzNAorI2RlZmluZSBNVjY0NDYwX0VUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzAJCQkgICAgMHgyMjgwCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfMQkJCSAgICAweDIyODQKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfSElHSF9BRERSX1JFTUFQX1JFR18yCQkJICAgIDB4MjI4OAorI2RlZmluZSBNVjY0NDYwX0VUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzMJCQkgICAgMHgyMjhjCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJICAgIDB4MjI5MAorI2RlZmluZSBNVjY0NDYwX0VUSF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcocG9ydCkJCQkgICAoMHgyMjk0ICsgKHBvcnQ8PDIpKQorI2RlZmluZSBNVjY0NDYwX0VUSF9NSUJfQ09VTlRFUlNfQkFTRShwb3J0KQkJCSAgICgweDMwMDAgKyAocG9ydDw8NykpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1BPUlRfQ09ORklHX1JFRyhwb3J0KQkJCSAgICgweDI0MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9QT1JUX0NPTkZJR19FWFRFTkRfUkVHKHBvcnQpCQkgICAoMHgyNDA0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfTUlJX1NFUklBTF9QQVJBTUVUUlNfUkVHKHBvcnQpCQkgICAoMHgyNDA4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfR01JSV9TRVJJQUxfUEFSQU1FVFJTX1JFRyhwb3J0KQkJICAgKDB4MjQwYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1ZMQU5fRVRIRVJUWVBFX1JFRyhwb3J0KQkJCSAgICgweDI0MTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9NQUNfQUREUl9MT1cocG9ydCkJCQkJICAgKDB4MjQxNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX01BQ19BRERSX0hJR0gocG9ydCkJCQkJICAgKDB4MjQxOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1NETUFfQ09ORklHX1JFRyhwb3J0KQkJCSAgICgweDI0MWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9EU0NQXzAocG9ydCkJCQkJICAgKDB4MjQyMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0RTQ1BfMShwb3J0KQkJCQkgICAoMHgyNDI0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfRFNDUF8yKHBvcnQpCQkJCSAgICgweDI0MjggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9EU0NQXzMocG9ydCkJCQkJICAgKDB4MjQyYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0RTQ1BfNChwb3J0KQkJCQkgICAoMHgyNDMwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfRFNDUF81KHBvcnQpCQkJCSAgICgweDI0MzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9EU0NQXzYocG9ydCkJCQkJICAgKDB4MjQzOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKHBvcnQpCQkgICAoMHgyNDNjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVkxBTl9QUklPUklUWV9UQUdfVE9fUFJJT1JJVFkocG9ydCkJCSAgICgweDI0NDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9QT1JUX1NUQVRVU19SRUcocG9ydCkJCQkgICAoMHgyNDQ0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcocG9ydCkJCSAgICgweDI0NDggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV9GSVhFRF9QUklPUklUWShwb3J0KQkJICAgKDB4MjQ0YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1BPUlRfVFhfVE9LRU5fQlVDS0VUX1JBVEVfQ09ORklHKHBvcnQpCSAgICgweDI0NTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9NQVhJTVVNX1RSQU5TTUlUX1VOSVQocG9ydCkJCQkgICAoMHgyNDU4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfUE9SVF9NQVhJTVVNX1RPS0VOX0JVQ0tFVF9TSVpFKHBvcnQpCSAgICgweDI0NWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnQpCQkJICAgKDB4MjQ2MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0lOVEVSUlVQVF9DQVVTRV9FWFRFTkRfUkVHKHBvcnQpCQkgICAoMHgyNDY0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfSU5URVJSVVBUX01BU0tfUkVHKHBvcnQpCQkJICAgKDB4MjQ2OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcocG9ydCkJCSAgICgweDI0NmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9GSUZPX1VSR0VOVF9USFJFU0hPTERfUkVHKHBvcnQpCQkgICAoMHgyNDcwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhwb3J0KQkJICAgKDB4MjQ3NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1JYX01JTklNQUxfRlJBTUVfU0laRV9SRUcocG9ydCkJCSAgICgweDI0N2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9ESVNDQVJERURfRlJBTUVTX0NPVU5URVIocG9ydCkJCSAgICgweDI0ODQgKyAocG9ydDw8MTApCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1BPUlRfREVCVUdfMF9SRUcocG9ydCkJCQkgICAoMHgyNDhjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfUE9SVF9ERUJVR18xX1JFRyhwb3J0KQkJCSAgICgweDI0OTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9QT1JUX0lOVEVSTkFMX0FERFJfRVJST1JfUkVHKHBvcnQpCQkgICAoMHgyNDk0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfSU5URVJOQUxfVVNFX1JFRyhwb3J0KQkJCSAgICgweDI0ZmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnQpCQkgICAoMHgyNjgwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfQ1VSUkVOVF9TRVJWRURfVFhfREVTQ19QVFIocG9ydCkJCSAgICgweDI2ODQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAocG9ydCkJCSAgICgweDI2MGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzEocG9ydCkJCSAgICgweDI2MWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzIocG9ydCkJCSAgICgweDI2MmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzMocG9ydCkJCSAgICgweDI2M2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzQocG9ydCkJCSAgICgweDI2NGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzUocG9ydCkJCSAgICgweDI2NWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzYocG9ydCkJCSAgICgweDI2NmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzcocG9ydCkJCSAgICgweDI2N2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAocG9ydCkJCSAgICgweDI2YzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzEocG9ydCkJCSAgICgweDI2YzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzIocG9ydCkJCSAgICgweDI2YzggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzMocG9ydCkJCSAgICgweDI2Y2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzQocG9ydCkJCSAgICgweDI2ZDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzUocG9ydCkJCSAgICgweDI2ZDQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzYocG9ydCkJCSAgICgweDI2ZDggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzcocG9ydCkJCSAgICgweDI2ZGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV8wX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjcwMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzFfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzEwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfMl9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3MjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV8zX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjczMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzRfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzQwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfNV9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3NTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV82X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc2MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzdfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkgICAoMHgyNzcwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfMF9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3MDQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV8xX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjcxNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzJfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkgICAoMHgyNzI0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfM19UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3MzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV80X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc0NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzVfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkgICAoMHgyNzU0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfNl9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCSAgICgweDI3NjQgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV83X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc3NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzBfQVJCSVRFUl9DT05GSUcocG9ydCkJCSAgICgweDI3MDggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV8xX0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzE4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfMl9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJICAgKDB4MjcyOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzNfQVJCSVRFUl9DT05GSUcocG9ydCkJCSAgICgweDI3MzggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV80X0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfVFhfUVVFVUVfNV9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJICAgKDB4Mjc1OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX1RYX1FVRVVFXzZfQVJCSVRFUl9DT05GSUcocG9ydCkJCSAgICgweDI3NjggKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9UWF9RVUVVRV83X0FSQklURVJfQ09ORklHKHBvcnQpCQkgICAoMHgyNzc4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgTVY2NDQ2MF9FVEhfUE9SVF9UWF9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSAgICgweDI3ODAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9EQV9GSUxURVJfU1BFQ0lBTF9NVUxUSUNBU1RfVEFCTEVfQkFTRShwb3J0KSAgICgweDM0MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBNVjY0NDYwX0VUSF9EQV9GSUxURVJfT1RIRVJfTVVMVElDQVNUX1RBQkxFX0JBU0UocG9ydCkJICAgKDB4MzUwMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIE1WNjQ0NjBfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UocG9ydCkJCSAgICgweDM2MDAgKyAocG9ydDw8MTApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBDVU5JVCAgUmVnaXN0ZXJzCQkgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkgLyogQWRkcmVzcyBEZWNvZGluZyBSZWdpc3RlciBNYXAgKi8KKworI2RlZmluZSBNVjY0NDYwX0NVTklUX0JBU0VfQUREUl9SRUcwCQkJCSAgICAweGYyMDAKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfUkVHMQkJCQkgICAgMHhmMjA4CisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX1JFRzIJCQkJICAgIDB4ZjIxMAorI2RlZmluZSBNVjY0NDYwX0NVTklUX0JBU0VfQUREUl9SRUczCQkJCSAgICAweGYyMTgKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9TSVpFMAkJCQkJICAgIDB4ZjIwNAorI2RlZmluZSBNVjY0NDYwX0NVTklUX1NJWkUxCQkJCQkgICAgMHhmMjBjCisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfU0laRTIJCQkJCSAgICAweGYyMTQKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9TSVpFMwkJCQkJICAgIDB4ZjIxYworI2RlZmluZSBNVjY0NDYwX0NVTklUX0hJR0hfQUREUl9SRU1BUF9SRUcwCQkJICAgIDB4ZjI0MAorI2RlZmluZSBNVjY0NDYwX0NVTklUX0hJR0hfQUREUl9SRU1BUF9SRUcxCQkJICAgIDB4ZjI0NAorI2RlZmluZSBNVjY0NDYwX0NVTklUX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJICAgIDB4ZjI1MAorI2RlZmluZSBNVjY0NDYwX01QU0MwX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJCSAgICAweGYyNTQKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDMV9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCQkgICAgMHhmMjU4CisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfSU5URVJOQUxfU1BBQ0VfQkFTRV9BRERSX1JFRwkJICAgIDB4ZjI1QworCisJLyogIEVycm9yIFJlcG9ydCBSZWdpc3RlcnMgICovCisKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9JTlRFUlJVUFRfQ0FVU0VfUkVHCQkJICAgIDB4ZjMxMAorI2RlZmluZSBNVjY0NDYwX0NVTklUX0lOVEVSUlVQVF9NQVNLX1JFRwkJCSAgICAweGYzMTQKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9FUlJPUl9BRERSCQkJCSAgICAweGYzMTgKKworCS8qICBDdW5pdCBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfQVJCSVRFUl9DT05UUk9MX1JFRwkJCSAgICAweGYzMDAKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9DT05GSUdfUkVHCQkJCSAgICAweGI0MGMKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9DUlJPU0JBUl9USU1FT1VUX1JFRwkJCSAgICAweGYzMDQKKworCS8qICBDdW5pdCBEZWJ1ZyBSZWdpc3RlcnMgICAqLworCisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfREVCVUdfTE9XCQkJCQkgICAgMHhmMzQwCisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfREVCVUdfSElHSAkJCQkgICAgMHhmMzQ0CisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfTU1BU0sJCQkJCSAgICAweGYzODAKKworCS8qICBDdW5pdCBCYXNlIEFkZHJlc3MgRW5hYmxlIFdpbmRvdyBCaXRzKi8KKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzBfQklUCQkJIDB4MAorI2RlZmluZSBNVjY0NDYwX0NVTklUX0JBU0VfQUREUl9XSU5fMV9CSVQJCQkgMHgxCisjZGVmaW5lIE1WNjQ0NjBfQ1VOSVRfQkFTRV9BRERSX1dJTl8yX0JJVAkJCSAweDIKKyNkZWZpbmUgTVY2NDQ2MF9DVU5JVF9CQVNFX0FERFJfV0lOXzNfQklUCQkJIDB4MworCisJLyogIE1QU0NzIENsb2NrcyBSb3V0aW5nIFJlZ2lzdGVycyAgKi8KKworI2RlZmluZSBNVjY0NDYwX01QU0NfUk9VVElOR19SRUcJCQkJICAgIDB4YjQwMAorI2RlZmluZSBNVjY0NDYwX01QU0NfUlhfQ0xPQ0tfUk9VVElOR19SRUcJCQkgICAgMHhiNDA0CisjZGVmaW5lIE1WNjQ0NjBfTVBTQ19UWF9DTE9DS19ST1VUSU5HX1JFRwkJCSAgICAweGI0MDgKKworCS8qICBNUFNDcyBJbnRlcnJ1cHRzIFJlZ2lzdGVycwkgICovCisKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NBVVNFX1JFRyhwb3J0KQkJCQkgICAoMHhiODA0ICsgKHBvcnQ8PDMpKQorI2RlZmluZSBNVjY0NDYwX01QU0NfTUFTS19SRUcocG9ydCkJCQkJICAgKDB4Yjg4NCArIChwb3J0PDwzKSkKKworI2RlZmluZSBNVjY0NDYwX01QU0NfTUFJTl9DT05GSUdfTE9XKHBvcnQpCQkJICAgKDB4ODAwMCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQ0NjBfTVBTQ19NQUlOX0NPTkZJR19ISUdIKHBvcnQpCQkJICAgKDB4ODAwNCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1WNjQ0NjBfTVBTQ19QUk9UT0NPTF9DT05GSUcocG9ydCkJCQkgICAoMHg4MDA4ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHMShwb3J0KQkJCQkgICAoMHg4MDBjICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHMihwb3J0KQkJCQkgICAoMHg4MDEwICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHMyhwb3J0KQkJCQkgICAoMHg4MDE0ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHNChwb3J0KQkJCQkgICAoMHg4MDE4ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHNShwb3J0KQkJCQkgICAoMHg4MDFjICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHNihwb3J0KQkJCQkgICAoMHg4MDIwICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHNyhwb3J0KQkJCQkgICAoMHg4MDI0ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHOChwb3J0KQkJCQkgICAoMHg4MDI4ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHOShwb3J0KQkJCQkgICAoMHg4MDJjICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVY2NDQ2MF9NUFNDX0NIQU5ORUxfUkVHMTAocG9ydCkJCQkgICAoMHg4MDMwICsgKHBvcnQ8PDEyKSkKKworCS8qICBNUFNDMCBSZWdpc3RlcnMJICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBTRE1BIFJlZ2lzdGVycwkgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX0NPTkZJR19SRUcoY2hhbm5lbCkJCQkoMHg0MDAwICsgKGNoYW5uZWw8PDEzKSkKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX0NPTU1BTkRfUkVHKGNoYW5uZWwpCQkJKDB4NDAwOCArIChjaGFubmVsPDwxMykpCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUihjaGFubmVsKQkoMHg0ODEwICsgKGNoYW5uZWw8PDEzKSkKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSKGNoYW5uZWwpCSgweDRjMTAgKyAoY2hhbm5lbDw8MTMpKQorI2RlZmluZSBNVjY0NDYwX1NETUFfRklSU1RfVFhfREVTQ1JJUFRPUl9QT0lOVEVSKGNoYW5uZWwpCSgweDRjMTQgKyAoY2hhbm5lbDw8MTMpKQorCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9DQVVTRV9SRUcJCQkJCSAgICAweGI4MDAKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX01BU0tfUkVHCQkJCQkgICAgMHhiODgwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRE1BIEFkZHJlc3MgU3BhY2UgVGFyZ2V0cwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzBfVEFSR0VUCQkJCSAgICAweDBlMDAKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX0RSQU1fQ1NfMV9UQVJHRVQJCQkJICAgIDB4MGQwMAorI2RlZmluZSBNVjY0NDYwX1NETUFfRFJBTV9DU18yX1RBUkdFVAkJCQkgICAgMHgwYjAwCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9EUkFNX0NTXzNfVEFSR0VUCQkJCSAgICAweDA3MDAKKworI2RlZmluZSBNVjY0NDYwX1NETUFfREVWX0NTXzBfVEFSR0VUCQkJCSAgICAweDFlMDEKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX0RFVl9DU18xX1RBUkdFVAkJCQkgICAgMHgxZDAxCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9ERVZfQ1NfMl9UQVJHRVQJCQkJICAgIDB4MWIwMQorI2RlZmluZSBNVjY0NDYwX1NETUFfREVWX0NTXzNfVEFSR0VUCQkJCSAgICAweDE3MDEKKworI2RlZmluZSBNVjY0NDYwX1NETUFfQk9PVF9DU19UQVJHRVQJCQkJICAgIDB4MGYwMAorCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9TUkFNX1RBUkdFVAkJCQkgICAgMHgwMDAzCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV82MFhfQlVTX1RBUkdFVAkJCQkgICAgMHg0MDAzCisKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMF9UQVJHRVQJCQkJCSAgICAweDAwMDMKKyNkZWZpbmUgTVY2NDQ2MF9QQ0lfMV9UQVJHRVQJCQkJCSAgICAweDAwMDQKKworCisvKiBEZXZpY2VzIEJBUiBhbmQgc2l6ZSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBNVjY0NDYwX0RFVl9DUzBfQkFTRV9BRERSCQkJCSAgICAweDAyOAorI2RlZmluZSBNVjY0NDYwX0RFVl9DUzBfU0laRQkJCQkJICAgIDB4MDMwCisjZGVmaW5lIE1WNjQ0NjBfREVWX0NTMV9CQVNFX0FERFIJCQkJICAgIDB4MjI4CisjZGVmaW5lIE1WNjQ0NjBfREVWX0NTMV9TSVpFCQkJCQkgICAgMHgyMzAKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MyX0JBU0VfQUREUgkJCQkgICAgMHgyNDgKKyNkZWZpbmUgTVY2NDQ2MF9ERVZfQ1MyX1NJWkUJCQkJCSAgICAweDI1MAorI2RlZmluZSBNVjY0NDYwX0RFVl9DUzNfQkFTRV9BRERSCQkJCSAgICAweDAzOAorI2RlZmluZSBNVjY0NDYwX0RFVl9DUzNfU0laRQkJCQkJICAgIDB4MDQwCisjZGVmaW5lIE1WNjQ0NjBfQk9PVENTX0JBU0VfQUREUgkJCQkgICAgMHgyMzgKKyNkZWZpbmUgTVY2NDQ2MF9CT09UQ1NfU0laRQkJCQkJICAgIDB4MjQwCisKKy8qIFNETUEgV2luZG93IGFjY2VzcyBwcm90ZWN0aW9uICovCisjZGVmaW5lIE1WNjQ0NjBfU0RNQV9XSU5fQUNDRVNTX05PVF9BTExPV0VEIDAKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX1dJTl9BQ0NFU1NfUkVBRF9PTkxZIDEKKyNkZWZpbmUgTVY2NDQ2MF9TRE1BX1dJTl9BQ0NFU1NfRlVMTCAyCisKKy8qIEJSRyBJbnRlcnJ1cHRzICovCisKKyNkZWZpbmUgTVY2NDQ2MF9CUkdfQ09ORklHX1JFRyhicmcpCQkJCSAoMHhiMjAwICsgKGJyZzw8MykpCisjZGVmaW5lIE1WNjQ0NjBfQlJHX0JBVURFX1RVTklOR19SRUcoYnJnKQkJCSAoMHhiMjA0ICsgKGJyZzw8MykpCisjZGVmaW5lIE1WNjQ0NjBfQlJHX0NBVVNFX1JFRwkJCQkJICAgIDB4YjgzNAorI2RlZmluZSBNVjY0NDYwX0JSR19NQVNLX1JFRwkJCQkJICAgIDB4YjhiNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQSBDaGFubmVsIENvbnRyb2wJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDBfQ09OVFJPTAkJCQkgICAgMHg4NDAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDBfQ09OVFJPTF9ISUdICQkJICAgIDB4ODgwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwxX0NPTlRST0wJCQkJICAgIDB4ODQ0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwxX0NPTlRST0xfSElHSAkJCSAgICAweDg4NAorI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMMl9DT05UUk9MCQkJCSAgICAweDg0OAorI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMMl9DT05UUk9MX0hJR0gJCQkgICAgMHg4ODgKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDNfQ09OVFJPTAkJCQkgICAgMHg4NEMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDNfQ09OVFJPTF9ISUdICQkJICAgIDB4ODhDCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgIElETUEgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDBfQllURV9DT1VOVAkJCQkgICAgMHg4MDAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDFfQllURV9DT1VOVAkJCQkgICAgMHg4MDQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDJfQllURV9DT1VOVAkJCQkgICAgMHg4MDgKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDNfQllURV9DT1VOVAkJCQkgICAgMHg4MEMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDBfU09VUkNFX0FERFIJCQkgICAgMHg4MTAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDFfU09VUkNFX0FERFIJCQkgICAgMHg4MTQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDJfU09VUkNFX0FERFIJCQkgICAgMHg4MTgKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDNfU09VUkNFX0FERFIJCQkgICAgMHg4MWMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDBfREVTVElOQVRJT05fQUREUgkJCSAgICAweDgyMAorI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMMV9ERVNUSU5BVElPTl9BRERSCQkJICAgIDB4ODI0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwyX0RFU1RJTkFUSU9OX0FERFIJCQkgICAgMHg4MjgKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDNfREVTVElOQVRJT05fQUREUgkJCSAgICAweDgyQworI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMMF9ORVhUX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODMwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwxX05FWFRfREVTQ1JJUFRPUl9QT0lOVEVSCQkgICAgMHg4MzQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDJfTkVYVF9ERVNDUklQVE9SX1BPSU5URVIJCSAgICAweDgzOAorI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMM19ORVhUX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODNDCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwwX0NVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkgICAgMHg4NzAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ0hBTk5FTDFfQ1VSUkVOVF9ERVNDUklQVE9SX1BPSU5URVIJCSAgICAweDg3NAorI2RlZmluZSBNVjY0NDYwX0RNQV9DSEFOTkVMMl9DVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJICAgIDB4ODc4CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwzX0NVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkgICAgMHg4N0MKKworIC8qICBJRE1BIEFkZHJlc3MgRGVjb2RpbmcgQmFzZSBBZGRyZXNzIFJlZ2lzdGVycyAgKi8KKworI2RlZmluZSBNVjY0NDYwX0RNQV9CQVNFX0FERFJfUkVHMAkJCQkgICAgMHhhMDAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQkFTRV9BRERSX1JFRzEJCQkJICAgIDB4YTA4CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0JBU0VfQUREUl9SRUcyCQkJCSAgICAweGExMAorI2RlZmluZSBNVjY0NDYwX0RNQV9CQVNFX0FERFJfUkVHMwkJCQkgICAgMHhhMTgKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQkFTRV9BRERSX1JFRzQJCQkJICAgIDB4YTIwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0JBU0VfQUREUl9SRUc1CQkJCSAgICAweGEyOAorI2RlZmluZSBNVjY0NDYwX0RNQV9CQVNFX0FERFJfUkVHNgkJCQkgICAgMHhhMzAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQkFTRV9BRERSX1JFRzcJCQkJICAgIDB4YTM4CisKKyAvKiAgSURNQSBBZGRyZXNzIERlY29kaW5nIFNpemUgQWRkcmVzcyBSZWdpc3RlciAgICovCisKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUcwCQkJCQkgICAgMHhhMDQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUcxCQkJCQkgICAgMHhhMGMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUcyCQkJCQkgICAgMHhhMTQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUczCQkJCQkgICAgMHhhMWMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUc0CQkJCQkgICAgMHhhMjQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUc1CQkJCQkgICAgMHhhMmMKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUc2CQkJCQkgICAgMHhhMzQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU0laRV9SRUc3CQkJCQkgICAgMHhhM0MKKworIC8qIElETUEgQWRkcmVzcyBEZWNvZGluZyBIaWdoIEFkZHJlc3MgUmVtYXAgYW5kIEFjY2VzcworCQkgIFByb3RlY3Rpb24gUmVnaXN0ZXJzCQkJICAqLworCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0hJR0hfQUREUl9SRU1BUF9SRUcwCQkJICAgIDB4YTYwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0hJR0hfQUREUl9SRU1BUF9SRUcxCQkJICAgIDB4YTY0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0hJR0hfQUREUl9SRU1BUF9SRUcyCQkJICAgIDB4YTY4CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0hJR0hfQUREUl9SRU1BUF9SRUczCQkJICAgIDB4YTZDCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJICAgIDB4YTgwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwwX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJICAgIDB4YTcwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwxX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJICAgIDB4YTc0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwyX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJICAgIDB4YTc4CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0NIQU5ORUwzX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJICAgIDB4YTdjCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0FSQklURVJfQ09OVFJPTAkJCQkgICAgMHg4NjAKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJICAgIDB4OGQwCisKKyAvKiAgSURNQSBIZWFkZXJzIFJldGFyZ2V0IFJlZ2lzdGVycyAgICovCisKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJICAgIDB4YTg0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAgICAweGE4OAorCisgLyogIElETUEgSW50ZXJydXB0IFJlZ2lzdGVyICAqLworCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0lOVEVSUlVQVF9DQVVTRV9SRUcJCQkJICAgIDB4OGMwCisjZGVmaW5lIE1WNjQ0NjBfRE1BX0lOVEVSUlVQVF9DQVVTRV9NQVNLCQkJICAgIDB4OGM0CisjZGVmaW5lIE1WNjQ0NjBfRE1BX0VSUk9SX0FERFIJCQkJCSAgICAweDhjOAorI2RlZmluZSBNVjY0NDYwX0RNQV9FUlJPUl9TRUxFQ1QJCQkJICAgIDB4OGNjCisKKyAvKiAgSURNQSBEZWJ1ZyBSZWdpc3RlciAoIGZvciBpbnRlcm5hbCB1c2UgKQkgKi8KKworI2RlZmluZSBNVjY0NDYwX0RNQV9ERUJVR19MT1cJCQkJCSAgICAweDhlMAorI2RlZmluZSBNVjY0NDYwX0RNQV9ERUJVR19ISUdICQkJCQkgICAgMHg4ZTQKKyNkZWZpbmUgTVY2NDQ2MF9ETUFfU1BBUkUJCQkJCSAgICAweEE4QworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRpbWVyX0NvdW50ZXIJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9USU1FUl9DT1VOVEVSMAkJCQkJICAgIDB4ODUwCisjZGVmaW5lIE1WNjQ0NjBfVElNRVJfQ09VTlRFUjEJCQkJCSAgICAweDg1NAorI2RlZmluZSBNVjY0NDYwX1RJTUVSX0NPVU5URVIyCQkJCQkgICAgMHg4NTgKKyNkZWZpbmUgTVY2NDQ2MF9USU1FUl9DT1VOVEVSMwkJCQkJICAgIDB4ODVDCisjZGVmaW5lIE1WNjQ0NjBfVElNRVJfQ09VTlRFUl8wXzNfQ09OVFJPTAkJCSAgICAweDg2NAorI2RlZmluZSBNVjY0NDYwX1RJTUVSX0NPVU5URVJfMF8zX0lOVEVSUlVQVF9DQVVTRQkJICAgIDB4ODY4CisjZGVmaW5lIE1WNjQ0NjBfVElNRVJfQ09VTlRFUl8wXzNfSU5URVJSVVBUX01BU0sJCSAgICAweDg2YworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgIFdhdGNoZG9nIHJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfV0FUQ0hET0dfQ09ORklHX1JFRwkJCQkgICAgMHhiNDEwCisjZGVmaW5lIE1WNjQ0NjBfV0FUQ0hET0dfVkFMVUVfUkVHCQkJCSAgICAweGI0MTQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJMkMgUmVnaXN0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfSTJDX1NMQVZFX0FERFIJCQkJCSAgICAweGMwMDAKKyNkZWZpbmUgTVY2NDQ2MF9JMkNfRVhURU5ERURfU0xBVkVfQUREUgkJCQkgICAgMHhjMDEwCisjZGVmaW5lIE1WNjQ0NjBfSTJDX0RBVEEJCQkJCSAgICAweGMwMDQKKyNkZWZpbmUgTVY2NDQ2MF9JMkNfQ09OVFJPTAkJCQkJICAgIDB4YzAwOAorI2RlZmluZSBNVjY0NDYwX0kyQ19TVEFUVVNfQkFVREVfUkFURQkJCQkgICAgMHhjMDBDCisjZGVmaW5lIE1WNjQ0NjBfSTJDX1NPRlRfUkVTRVQJCQkJCSAgICAweGMwMWMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHUFAgSW50ZXJmYWNlIFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfR1BQX0lPX0NPTlRST0wJCQkJCSAgICAweGYxMDAKKyNkZWZpbmUgTVY2NDQ2MF9HUFBfTEVWRUxfQ09OVFJPTAkJCQkgICAgMHhmMTEwCisjZGVmaW5lIE1WNjQ0NjBfR1BQX1ZBTFVFCQkJCQkgICAgMHhmMTA0CisjZGVmaW5lIE1WNjQ0NjBfR1BQX0lOVEVSUlVQVF9DQVVTRQkJCQkgICAgMHhmMTA4CisjZGVmaW5lIE1WNjQ0NjBfR1BQX0lOVEVSUlVQVF9NQVNLMAkJCQkgICAgMHhmMTBjCisjZGVmaW5lIE1WNjQ0NjBfR1BQX0lOVEVSUlVQVF9NQVNLMQkJCQkgICAgMHhmMTE0CisjZGVmaW5lIE1WNjQ0NjBfR1BQX1ZBTFVFX1NFVAkJCQkJICAgIDB4ZjExOAorI2RlZmluZSBNVjY0NDYwX0dQUF9WQUxVRV9DTEVBUgkJCQkJICAgIDB4ZjExYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdCBDb250cm9sbGVyIFJlZ2lzdGVycwkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJydXB0cwkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTVY2NDQ2MF9NQUlOX0lOVEVSUlVQVF9DQVVTRV9MT1cJCQkgICAgMHgwMDQKKyNkZWZpbmUgTVY2NDQ2MF9NQUlOX0lOVEVSUlVQVF9DQVVTRV9ISUdICQkJICAgIDB4MDBjCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDBfTUFTS19MT1cJCQkJICAgIDB4MDE0CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDBfTUFTS19ISUdICQkJICAgIDB4MDFjCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDBfU0VMRUNUX0NBVVNFCQkJICAgIDB4MDI0CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDFfTUFTS19MT1cJCQkJICAgIDB4MDM0CisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDFfTUFTS19ISUdICQkJICAgIDB4MDNjCisjZGVmaW5lIE1WNjQ0NjBfQ1BVX0lOVEVSUlVQVDFfU0VMRUNUX0NBVVNFCQkJICAgIDB4MDQ0CisjZGVmaW5lIE1WNjQ0NjBfSU5URVJSVVBUMF9NQVNLXzBfTE9XCQkJCSAgICAweDA1NAorI2RlZmluZSBNVjY0NDYwX0lOVEVSUlVQVDBfTUFTS18wX0hJR0gJCQkJICAgIDB4MDVjCisjZGVmaW5lIE1WNjQ0NjBfSU5URVJSVVBUMF9TRUxFQ1RfQ0FVU0UJCQkJICAgIDB4MDY0CisjZGVmaW5lIE1WNjQ0NjBfSU5URVJSVVBUMV9NQVNLXzBfTE9XCQkJCSAgICAweDA3NAorI2RlZmluZSBNVjY0NDYwX0lOVEVSUlVQVDFfTUFTS18wX0hJR0gJCQkJICAgIDB4MDdjCisjZGVmaW5lIE1WNjQ0NjBfSU5URVJSVVBUMV9TRUxFQ1RfQ0FVU0UJCQkJICAgIDB4MDg0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJTVBQIEludGVyZmFjZSBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNVjY0NDYwX01QUF9DT05UUk9MMAkJCQkJICAgIDB4ZjAwMAorI2RlZmluZSBNVjY0NDYwX01QUF9DT05UUk9MMQkJCQkJICAgIDB4ZjAwNAorI2RlZmluZSBNVjY0NDYwX01QUF9DT05UUk9MMgkJCQkJICAgIDB4ZjAwOAorI2RlZmluZSBNVjY0NDYwX01QUF9DT05UUk9MMwkJCQkJICAgIDB4ZjAwYworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgIFNlcmlhbCBJbml0aWFsaXphdGlvbiByZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WNjQ0NjBfU0VSSUFMX0lOSVRfTEFTVF9EQVRBCQkJCSAgICAweGYzMjQKKyNkZWZpbmUgTVY2NDQ2MF9TRVJJQUxfSU5JVF9DT05UUk9MCQkJCSAgICAweGYzMjgKKyNkZWZpbmUgTVY2NDQ2MF9TRVJJQUxfSU5JVF9TVEFUVVMJCQkJICAgIDB4ZjMyYworCisKKyNlbmRpZiAvKiBfX0lOQ2d0NjQ0NjByaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9kYjY0NDYwL3BjaS5jIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzcyODQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvcGNpLmMKQEAgLTAsMCArMSw5NDAgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisvKiBQQ0kuYyAtIFBDSSBmdW5jdGlvbnMgKi8KKworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL3BjaS5oIgorCisjdW5kZWYgREVCVUcKKyN1bmRlZiBJREVfU0VUX05BVElWRV9NT0RFCitzdGF0aWMgdW5zaWduZWQgaW50IGxvY2FsX2J1c2VzW10gPSB7IDAsIDAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGNpX2lycV9zd2l6emxlWzJdW1BDSV9NQVhfREVWSUNFU10gPSB7CisJezAsIDAsIDAsIDAsIDAsIDAsIDAsIDI3LCAyNywgWzkgLi4uIFBDSV9NQVhfREVWSUNFUyAtIDFdID0gMCB9LAorCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAyOSwgMjksIFs5IC4uLiBQQ0lfTUFYX0RFVklDRVMgLSAxXSA9IDAgfSwKK307CisKKworI2lmZGVmIERFQlVHCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9idXNfbGlzdFtdID0geyBQQ0lfMF9NT0RFLCBQQ0lfMV9NT0RFIH07CitzdGF0aWMgdm9pZCBndF9wY2lfYnVzX21vZGVfZGlzcGxheSAoUENJX0hPU1QgaG9zdCkKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCisJbW9kZSA9IChHVFJFR1JFQUQgKHBjaV9idXNfbGlzdFtob3N0XSkgJiAoQklUNCB8IEJJVDUpKSA+PiA0OworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgMDoKKwkJcHJpbnRmICgiUENJICVkIGJ1cyBtb2RlOiBDb252ZW50aW9uYWwgUENJXG4iLCBob3N0KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwcmludGYgKCJQQ0kgJWQgYnVzIG1vZGU6IDY2IE1oeiBQQ0lYXG4iLCBob3N0KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcmludGYgKCJQQ0kgJWQgYnVzIG1vZGU6IDEwMCBNaHogUENJWFxuIiwgaG9zdCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcHJpbnRmICgiUENJICVkIGJ1cyBtb2RlOiAxMzMgTWh6IFBDSVhcbiIsIGhvc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJVbmtub3duIEJVUyAlZFxuIiwgbW9kZSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tdID0geworCVBDSV8wUDJQX0NPTkZJR1VSQVRJT04sIFBDSV8xUDJQX0NPTkZJR1VSQVRJT04KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tdID0geworCVBDSV8wQ09ORklHVVJBVElPTl9BRERSRVNTLCBQQ0lfMUNPTkZJR1VSQVRJT05fQUREUkVTUworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfY29uZmlndXJhdGlvbl9kYXRhW10gPSB7CisJUENJXzBDT05GSUdVUkFUSU9OX0RBVEFfVklSVFVBTF9SRUdJU1RFUiwKKwlQQ0lfMUNPTkZJR1VSQVRJT05fREFUQV9WSVJUVUFMX1JFR0lTVEVSCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9lcnJvcl9jYXVzZV9yZWdbXSA9IHsKKwlQQ0lfMEVSUk9SX0NBVVNFLCBQQ0lfMUVSUk9SX0NBVVNFCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9hcmJpdGVyX2NvbnRyb2xbXSA9IHsKKwlQQ0lfMEFSQklURVJfQ09OVFJPTCwgUENJXzFBUkJJVEVSX0NPTlRST0wKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX2FkZHJlc3Nfc3BhY2VfZW5bXSA9IHsKKwlQQ0lfMF9CQVNFX0FERFJfUkVHX0VOQUJMRSwgUENJXzFfQkFTRV9BRERSX1JFR19FTkFCTEUKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX3Nub29wX2NvbnRyb2xfYmFzZV8wX2xvd1tdID0geworCVBDSV8wU05PT1BfQ09OVFJPTF9CQVNFXzBfTE9XLCBQQ0lfMVNOT09QX0NPTlRST0xfQkFTRV8wX0xPVworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNpX3Nub29wX2NvbnRyb2xfdG9wXzBbXSA9IHsKKwlQQ0lfMFNOT09QX0NPTlRST0xfVE9QXzAsIFBDSV8xU05PT1BfQ09OVFJPTF9UT1BfMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfYWNjZXNzX2NvbnRyb2xfYmFzZV8wX2xvd1tdID0geworCVBDSV8wQUNDRVNTX0NPTlRST0xfQkFTRV8wX0xPVywgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfYWNjZXNzX2NvbnRyb2xfdG9wXzBbXSA9IHsKKwlQQ0lfMEFDQ0VTU19DT05UUk9MX1RPUF8wLCBQQ0lfMUFDQ0VTU19DT05UUk9MX1RPUF8wCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjaV9zY3NfYmFua19zaXplWzJdWzRdID0geworCXtQQ0lfMFNDU18wX0JBTktfU0laRSwgUENJXzBTQ1NfMV9CQU5LX1NJWkUsCisJIFBDSV8wU0NTXzJfQkFOS19TSVpFLCBQQ0lfMFNDU18zX0JBTktfU0laRX0sCisJe1BDSV8xU0NTXzBfQkFOS19TSVpFLCBQQ0lfMVNDU18xX0JBTktfU0laRSwKKwkgUENJXzFTQ1NfMl9CQU5LX1NJWkUsIFBDSV8xU0NTXzNfQkFOS19TSVpFfQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2lfcDJwX2NvbmZpZ3VyYXRpb25bXSA9IHsKKwlQQ0lfMFAyUF9DT05GSUdVUkFUSU9OLCBQQ0lfMVAyUF9DT05GSUdVUkFUSU9OCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lXcml0ZUNvbmZpZ1JlZyAtIFdyaXRlIHRvIGEgUENJIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyogICAgICAgICAgICAgICAgICAgIC0gTWFrZSBzdXJlIHRoZSBHVCBpcyBjb25maWd1cmVkIGFzIGEgbWFzdGVyIGJlZm9yZSB3cml0aW5nCisqICAgICAgICAgICAgICAgICAgICAgIHRvIGFub3RoZXIgZGV2aWNlIG9uIHRoZSBQQ0kuCisqICAgICAgICAgICAgICAgICAgICAtIFRoZSBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIEJpZy9MaXR0bGUgZW5kaWFuIGNvbnZlcnNpb24uCisqCisqCisqIElucHV0czogICB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0OiBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGFzIGl0IGFwZWFycyBpbiB0aGUgR1Qgc3BlYworKiAgICAgICAgICAgICAgICAgICAob3IgYW55IG90aGVyIFBDSSBkZXZpY2Ugc3BlYykKKyogICAgICAgICAgIHBjaURldk51bTogVGhlIGRldmljZSBudW1iZXIgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgorKgorKiAgQ29uZmlndXJhdGlvbiBBZGRyZXNzIDB4Q0Y4OgorKgorKiAgICAgICAzMSAzMCAgICAyNCAyMyAgMTYgMTUgIDExIDEwICAgICA4IDcgICAgICAyICAwICAgICA8PWJpdCBOdW1iZXIKKyogIHxjb25naWZ8UmVzZXJ2ZWR8ICBCdXMgfERldmljZXxGdW5jdGlvbnxSZWdpc3RlcnwwMHwKKyogIHxFbmFibGV8ICAgICAgICB8TnVtYmVyfE51bWJlcnwgTnVtYmVyIHwgTnVtYmVyIHwgIHwgICAgPD1maWVsZCBOYW1lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaVdyaXRlQ29uZmlnUmVnIChQQ0lfSE9TVCBob3N0LCB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorCQkJdW5zaWduZWQgaW50IHBjaURldk51bSwgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERhdGFGb3JBZGRyUmVnOworCXVuc2lnbmVkIGludCBmdW5jdGlvbk51bTsKKwl1bnNpZ25lZCBpbnQgYnVzTnVtID0gMDsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKworCWlmIChwY2lEZXZOdW0gPiAzMikJLyogaWxsZWdhbCBkZXZpY2UgTnVtYmVyICovCisJCXJldHVybjsKKwlpZiAocGNpRGV2TnVtID09IFNFTEYpIHsJLyogY29uZmlndXJlIG91ciBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworCQlwY2lEZXZOdW0gPQorCQkJKEdUUkVHUkVBRCAocGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tob3N0XSkgPj4gMjQpICYKKwkJCTB4MWY7CisJCWJ1c051bSA9IEdUUkVHUkVBRCAocGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tob3N0XSkgJgorCQkJMHhmZjAwMDA7CisJfQorCWZ1bmN0aW9uTnVtID0gcmVnT2Zmc2V0ICYgMHgwMDAwMDcwMDsKKwlwY2lEZXZOdW0gPSBwY2lEZXZOdW0gPDwgMTE7CisJcmVnT2Zmc2V0ID0gcmVnT2Zmc2V0ICYgMHhmYzsKKwlEYXRhRm9yQWRkclJlZyA9CisJCShyZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSB8IGJ1c051bSkgfCBCSVQzMTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9jb25maWd1cmF0aW9uX2FkZHJlc3NbaG9zdF0sIERhdGFGb3JBZGRyUmVnKTsKKwlHVF9SRUdfUkVBRCAocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgJmFkZHIpOworCWlmIChhZGRyICE9IERhdGFGb3JBZGRyUmVnKQorCQlyZXR1cm47CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9kYXRhW2hvc3RdLCBkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVJlYWRDb25maWdSZWcgIC0gUmVhZCBmcm9tIGEgUENJMCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisqICAgICAgICAgICAgICAgICAgICAtIE1ha2Ugc3VyZSB0aGUgR1QgaXMgY29uZmlndXJlZCBhcyBhIG1hc3RlciBiZWZvcmUgcmVhZGluZworKiAgICAgICAgICAgICAgICAgICAgIGZyb20gYW5vdGhlciBkZXZpY2Ugb24gdGhlIFBDSS4KKyogICAgICAgICAgICAgICAgICAgLSBUaGUgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBCaWcvTGl0dGxlIGVuZGlhbiBjb252ZXJzaW9uLgorKiBJTlBVVFM6ICAgcmVnT2Zmc2V0OiBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGFzIGl0IGFwZWFycyBpbiB0aGUgR1Qgc3BlYyAob3IgUENJCisqICAgICAgICAgICAgICAgICAgICAgICAgc3BlYykKKyogICAgICAgICAgIHBjaURldk51bTogVGhlIGRldmljZSBudW1iZXIgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgorKiBSRVRVUk5TOiBkYXRhICwgaWYgdGhlIGRhdGEgPT0gMHhmZmZmZmZmZiBjaGVjayB0aGUgbWFzdGVyIGFib3J0IGJpdCBpbiB0aGUKKyogICAgICAgICAgICAgICAgIGNhdXNlIHJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcyB2YWxpZAorKgorKiAgQ29uZmlndXJhdGlvbiBBZGRyZXNzIDB4Q0Y4OgorKgorKiAgICAgICAzMSAzMCAgICAyNCAyMyAgMTYgMTUgIDExIDEwICAgICA4IDcgICAgICAyICAwICAgICA8PWJpdCBOdW1iZXIKKyogIHxjb25naWZ8UmVzZXJ2ZWR8ICBCdXMgfERldmljZXxGdW5jdGlvbnxSZWdpc3RlcnwwMHwKKyogIHxFbmFibGV8ICAgICAgICB8TnVtYmVyfE51bWJlcnwgTnVtYmVyIHwgTnVtYmVyIHwgIHwgICAgPD1maWVsZCBOYW1lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgcGNpUmVhZENvbmZpZ1JlZyAoUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgaW50IHJlZ09mZnNldCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpRGV2TnVtKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEYXRhRm9yQWRkclJlZzsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgZnVuY3Rpb25OdW07CisJdW5zaWduZWQgaW50IGJ1c051bSA9IDA7CisKKwlpZiAocGNpRGV2TnVtID4gMzIpCS8qIGlsbGVnYWwgZGV2aWNlIE51bWJlciAqLworCQlyZXR1cm4gMHhmZmZmZmZmZjsKKwlpZiAocGNpRGV2TnVtID09IFNFTEYpIHsJLyogY29uZmlndXJlIG91ciBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworCQlwY2lEZXZOdW0gPQorCQkJKEdUUkVHUkVBRCAocGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tob3N0XSkgPj4gMjQpICYKKwkJCTB4MWY7CisJCWJ1c051bSA9IEdUUkVHUkVBRCAocGNpX3AycF9jb25maWd1cmF0aW9uX3JlZ1tob3N0XSkgJgorCQkJMHhmZjAwMDA7CisJfQorCWZ1bmN0aW9uTnVtID0gcmVnT2Zmc2V0ICYgMHgwMDAwMDcwMDsKKwlwY2lEZXZOdW0gPSBwY2lEZXZOdW0gPDwgMTE7CisJcmVnT2Zmc2V0ID0gcmVnT2Zmc2V0ICYgMHhmYzsKKwlEYXRhRm9yQWRkclJlZyA9CisJCShyZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSB8IGJ1c051bSkgfCBCSVQzMTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9jb25maWd1cmF0aW9uX2FkZHJlc3NbaG9zdF0sIERhdGFGb3JBZGRyUmVnKTsKKwlHVF9SRUdfUkVBRCAocGNpX2NvbmZpZ3VyYXRpb25fYWRkcmVzc1tob3N0XSwgJmRhdGEpOworCWlmIChkYXRhICE9IERhdGFGb3JBZGRyUmVnKQorCQlyZXR1cm4gMHhmZmZmZmZmZjsKKwlHVF9SRUdfUkVBRCAocGNpX2NvbmZpZ3VyYXRpb25fZGF0YVtob3N0XSwgJmRhdGEpOworCXJldHVybiBkYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpT3ZlckJyaWRnZVdyaXRlQ29uZmlnUmVnIC0gV3JpdGUgdG8gYSBQQ0kgY29uZmlndXJhdGlvbiByZWdpc3RlciB3aGVyZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWdlbnQgaXMgcGxhY2VkIG9uIGFub3RoZXIgQnVzLiBGb3IgbW9yZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiByZWFkIFAyUCBpbiB0aGUgUENJIHNwZWMuCisqCisqIElucHV0czogICB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0IC0gVGhlIHJlZ2lzdGVyIG9mZnNldCBhcyBpdCBhcGVhcnMgaW4gdGhlCisqICAgICAgICAgICBHVCBzcGVjIChvciBhbnkgb3RoZXIgUENJIGRldmljZSBzcGVjKS4KKyogICAgICAgICAgIHVuc2lnbmVkIGludCBwY2lEZXZOdW0gLSBUaGUgZGV2aWNlIG51bWJlciBuZWVkcyB0byBiZSBhZGRyZXNzZWQuCisqICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnVzTnVtIC0gT24gd2hpY2ggYnVzIGRvZXMgdGhlIFRhcmdldCBhZ2VudCBjb25uZWN0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8uCisqICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YSAtIGRhdGEgdG8gYmUgd3JpdHRlbi4KKyoKKyogIENvbmZpZ3VyYXRpb24gQWRkcmVzcyAweENGODoKKyoKKyogICAgICAgMzEgMzAgICAgMjQgMjMgIDE2IDE1ICAxMSAxMCAgICAgOCA3ICAgICAgMiAgMCAgICAgPD1iaXQgTnVtYmVyCisqICB8Y29uZ2lmfFJlc2VydmVkfCAgQnVzIHxEZXZpY2V8RnVuY3Rpb258UmVnaXN0ZXJ8MDF8CisqICB8RW5hYmxlfCAgICAgICAgfE51bWJlcnxOdW1iZXJ8IE51bWJlciB8IE51bWJlciB8ICB8ICAgIDw9ZmllbGQgTmFtZQorKgorKiAgVGhlIGNvbmZpZ3VyYXRpb24gQWRkcmVzcyBpcyBjb25maWd1cmUgYXMgdHlwZS1JIChiaXRzWzE6MF0gPSAnMDEnKSBkdWUgdG8KKyogICBQQ0kgc3BlYyByZWZlcnJpbmcgdG8gUDJQLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBwY2lPdmVyQnJpZGdlV3JpdGVDb25maWdSZWcgKFBDSV9IT1NUIGhvc3QsCisJCQkJICB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorCQkJCSAgdW5zaWduZWQgaW50IHBjaURldk51bSwKKwkJCQkgIHVuc2lnbmVkIGludCBidXNOdW0sIHVuc2lnbmVkIGludCBkYXRhKQoreworCXVuc2lnbmVkIGludCBEYXRhRm9yUmVnOworCXVuc2lnbmVkIGludCBmdW5jdGlvbk51bTsKKworCWZ1bmN0aW9uTnVtID0gcmVnT2Zmc2V0ICYgMHgwMDAwMDcwMDsKKwlwY2lEZXZOdW0gPSBwY2lEZXZOdW0gPDwgMTE7CisJcmVnT2Zmc2V0ID0gcmVnT2Zmc2V0ICYgMHhmZjsKKwlidXNOdW0gPSBidXNOdW0gPDwgMTY7CisJaWYgKHBjaURldk51bSA9PSBTRUxGKSB7CS8qIFRoaXMgYm9hcmQgKi8KKwkJRGF0YUZvclJlZyA9IChyZWdPZmZzZXQgfCBwY2lEZXZOdW0gfCBmdW5jdGlvbk51bSkgfCBCSVQwOworCX0gZWxzZSB7CisJCURhdGFGb3JSZWcgPSAocmVnT2Zmc2V0IHwgcGNpRGV2TnVtIHwgZnVuY3Rpb25OdW0gfCBidXNOdW0pIHwKKwkJCUJJVDMxIHwgQklUMDsKKwl9CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9hZGRyZXNzW2hvc3RdLCBEYXRhRm9yUmVnKTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9jb25maWd1cmF0aW9uX2RhdGFbaG9zdF0sIGRhdGEpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lPdmVyQnJpZGdlUmVhZENvbmZpZ1JlZyAgLSBSZWFkIGZyb20gYSBQQ0luIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgd2hlcmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFnZW50IHRhcmdldCBsb2NhdGUgb24gYW5vdGhlciBQQ0kgYnVzLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNYWtlIHN1cmUgdGhlIEdUIGlzIGNvbmZpZ3VyZWQgYXMgYSBtYXN0ZXIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHJlYWRpbmcgZnJvbSBhbm90aGVyIGRldmljZSBvbiB0aGUgUENJLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBCaWcvTGl0dGxlIGVuZGlhbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uLgorKiBJTlBVVFM6ICAgcmVnT2Zmc2V0OiBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGFzIGl0IGFwZWFycyBpbiB0aGUgR1Qgc3BlYyAob3IgUENJCisqICAgICAgICAgICAgICAgICAgICAgICAgc3BlYykuIChjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldC4pCisqICAgICAgICAgICBwY2lEZXZOdW06IFRoZSBkZXZpY2UgbnVtYmVyIG5lZWRzIHRvIGJlIGFkZHJlc3NlZC4KKyogICAgICAgICAgIGJ1c051bTogdGhlIEJ1cyBudW1iZXIgd2hlcmUgdGhlIGFnZW50IGlzIHBsYWNlLgorKiBSRVRVUk5TOiBkYXRhICwgaWYgdGhlIGRhdGEgPT0gMHhmZmZmZmZmZiBjaGVjayB0aGUgbWFzdGVyIGFib3J0IGJpdCBpbiB0aGUKKyogICAgICAgICAgICAgICAgIGNhdXNlIHJlZ2lzdGVyIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBpcyB2YWxpZAorKgorKiAgQ29uZmlndXJhdGlvbiBBZGRyZXNzIDB4Q0Y4OgorKgorKiAgICAgICAzMSAzMCAgICAyNCAyMyAgMTYgMTUgIDExIDEwICAgICA4IDcgICAgICAyICAwICAgICA8PWJpdCBOdW1iZXIKKyogIHxjb25naWZ8UmVzZXJ2ZWR8ICBCdXMgfERldmljZXxGdW5jdGlvbnxSZWdpc3RlcnwwMXwKKyogIHxFbmFibGV8ICAgICAgICB8TnVtYmVyfE51bWJlcnwgTnVtYmVyIHwgTnVtYmVyIHwgIHwgICAgPD1maWVsZCBOYW1lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgcGNpT3ZlckJyaWRnZVJlYWRDb25maWdSZWcgKFBDSV9IT1NUIGhvc3QsCisJCQkJCSB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorCQkJCQkgdW5zaWduZWQgaW50IHBjaURldk51bSwKKwkJCQkJIHVuc2lnbmVkIGludCBidXNOdW0pCit7CisJdW5zaWduZWQgaW50IERhdGFGb3JSZWc7CisJdW5zaWduZWQgaW50IGRhdGE7CisJdW5zaWduZWQgaW50IGZ1bmN0aW9uTnVtOworCisJZnVuY3Rpb25OdW0gPSByZWdPZmZzZXQgJiAweDAwMDAwNzAwOworCXBjaURldk51bSA9IHBjaURldk51bSA8PCAxMTsKKwlyZWdPZmZzZXQgPSByZWdPZmZzZXQgJiAweGZmOworCWJ1c051bSA9IGJ1c051bSA8PCAxNjsKKwlpZiAocGNpRGV2TnVtID09IFNFTEYpIHsJLyogVGhpcyBib2FyZCAqLworCQlEYXRhRm9yUmVnID0gKHJlZ09mZnNldCB8IHBjaURldk51bSB8IGZ1bmN0aW9uTnVtKSB8IEJJVDMxOworCX0gZWxzZSB7CQkvKiBhZ2VudCBvbiBhbm90aGVyIGJ1cyAqLworCisJCURhdGFGb3JSZWcgPSAocmVnT2Zmc2V0IHwgcGNpRGV2TnVtIHwgZnVuY3Rpb25OdW0gfCBidXNOdW0pIHwKKwkJCUJJVDAgfCBCSVQzMTsKKwl9CisJR1RfUkVHX1dSSVRFIChwY2lfY29uZmlndXJhdGlvbl9hZGRyZXNzW2hvc3RdLCBEYXRhRm9yUmVnKTsKKwlHVF9SRUdfUkVBRCAocGNpX2NvbmZpZ3VyYXRpb25fZGF0YVtob3N0XSwgJmRhdGEpOworCXJldHVybiBkYXRhOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lHZXRSZWdPZmZzZXQgLSBHZXRzIHRoZSByZWdpc3RlciBvZmZzZXQgZm9yIHRoaXMgcmVnaW9uIGNvbmZpZy4KKyoKKyogSU5QVVQ6ICAgQnVzLCBSZWdpb24gLSBUaGUgYnVzIGFuZCByZWdpb24gd2UgYXNrIGZvciBpdHMgYmFzZSBhZGRyZXNzLgorKiBPVVRQVVQ6ICAgTi9BCisqIFJFVFVSTlM6IFBDSSByZWdpc3RlciBiYXNlIGFkZHJlc3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNpR2V0UmVnT2Zmc2V0IChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbikKK3sKKwlzd2l0Y2ggKGhvc3QpIHsKKwljYXNlIFBDSV9IT1NUMDoKKwkJc3dpdGNoIChyZWdpb24pIHsKKwkJY2FzZSBQQ0lfSU86CisJCQlyZXR1cm4gUENJXzBJX09fTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04wOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjE6CisJCQlyZXR1cm4gUENJXzBNRU1PUlkxX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMjoKKwkJCXJldHVybiBQQ0lfME1FTU9SWTJfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04zOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZM19MT1dfREVDT0RFX0FERFJFU1M7CisJCX0KKwljYXNlIFBDSV9IT1NUMToKKwkJc3dpdGNoIChyZWdpb24pIHsKKwkJY2FzZSBQQ0lfSU86CisJCQlyZXR1cm4gUENJXzFJX09fTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04wOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7CisJCWNhc2UgUENJX1JFR0lPTjE6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkxX0xPV19ERUNPREVfQUREUkVTUzsKKwkJY2FzZSBQQ0lfUkVHSU9OMjoKKwkJCXJldHVybiBQQ0lfMU1FTU9SWTJfTE9XX0RFQ09ERV9BRERSRVNTOworCQljYXNlIFBDSV9SRUdJT04zOgorCQkJcmV0dXJuIFBDSV8xTUVNT1JZM19MT1dfREVDT0RFX0FERFJFU1M7CisJCX0KKwl9CisJcmV0dXJuIFBDSV8wTUVNT1JZMF9MT1dfREVDT0RFX0FERFJFU1M7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGNpR2V0UmVtYXBPZmZzZXQgKFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uKQoreworCXN3aXRjaCAoaG9zdCkgeworCWNhc2UgUENJX0hPU1QwOgorCQlzd2l0Y2ggKHJlZ2lvbikgeworCQljYXNlIFBDSV9JTzoKKwkJCXJldHVybiBQQ0lfMElfT19BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04wOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZMF9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04xOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZMV9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04yOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZMl9BRERSRVNTX1JFTUFQOworCQljYXNlIFBDSV9SRUdJT04zOgorCQkJcmV0dXJuIFBDSV8wTUVNT1JZM19BRERSRVNTX1JFTUFQOworCQl9CisJY2FzZSBQQ0lfSE9TVDE6CisJCXN3aXRjaCAocmVnaW9uKSB7CisJCWNhc2UgUENJX0lPOgorCQkJcmV0dXJuIFBDSV8xSV9PX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjA6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkwX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjE6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkxX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjI6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkyX0FERFJFU1NfUkVNQVA7CisJCWNhc2UgUENJX1JFR0lPTjM6CisJCQlyZXR1cm4gUENJXzFNRU1PUlkzX0FERFJFU1NfUkVNQVA7CisJCX0KKwl9CisJcmV0dXJuIFBDSV8wTUVNT1JZMF9BRERSRVNTX1JFTUFQOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpR2V0QmFzZUFkZHJlc3MgLSBHZXRzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYSBQQ0kuCisqICAgICAgICAgICAtIElmIHRoZSBQQ0kgc2l6ZSBpcyAwIHRoZW4gdGhpcyBiYXNlIGFkZHJlc3MgaGFzIG5vIG1lYW5pbmchISEKKyoKKyoKKyogSU5QVVQ6ICAgQnVzLCBSZWdpb24gLSBUaGUgYnVzIGFuZCByZWdpb24gd2UgYXNrIGZvciBpdHMgYmFzZSBhZGRyZXNzLgorKiBPVVRQVVQ6ICAgTi9BCisqIFJFVFVSTlM6IFBDSSBiYXNlIGFkZHJlc3MuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBpbnQgcGNpR2V0QmFzZUFkZHJlc3MgKFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uKQoreworCXVuc2lnbmVkIGludCByZWdCYXNlOworCXVuc2lnbmVkIGludCByZWdFbmQ7CisJdW5zaWduZWQgaW50IHJlZ09mZnNldCA9IHBjaUdldFJlZ09mZnNldCAoaG9zdCwgcmVnaW9uKTsKKworCUdUX1JFR19SRUFEIChyZWdPZmZzZXQsICZyZWdCYXNlKTsKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0ICsgOCwgJnJlZ0VuZCk7CisKKwlpZiAocmVnRW5kIDw9IHJlZ0Jhc2UpCisJCXJldHVybiAweGZmZmZmZmZmOwkvKiBFUlJPUiAhISEgKi8KKworCXJlZ0Jhc2UgPSByZWdCYXNlIDw8IDE2OworCXJldHVybiByZWdCYXNlOworfQorCitib29sIHBjaU1hcFNwYWNlIChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbiwgdW5zaWduZWQgaW50IHJlbWFwQmFzZSwKKwkJICB1bnNpZ25lZCBpbnQgYmFua0Jhc2UsIHVuc2lnbmVkIGludCBiYW5rTGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBsb3cgPSAweGZmZjsKKwl1bnNpZ25lZCBpbnQgaGlnaCA9IDB4MDsKKwl1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0ID0gcGNpR2V0UmVnT2Zmc2V0IChob3N0LCByZWdpb24pOworCXVuc2lnbmVkIGludCByZW1hcE9mZnNldCA9IHBjaUdldFJlbWFwT2Zmc2V0IChob3N0LCByZWdpb24pOworCisJaWYgKGJhbmtMZW5ndGggIT0gMCkgeworCQlsb3cgPSAoYmFua0Jhc2UgPj4gMTYpICYgMHhmZmZmOworCQloaWdoID0gKChiYW5rQmFzZSArIGJhbmtMZW5ndGgpID4+IDE2KSAtIDE7CisJfQorCisJR1RfUkVHX1dSSVRFIChyZWdPZmZzZXQsIGxvdyB8ICgxIDw8IDI0KSk7CS8qIG5vIHN3YXBwaW5nICovCisJR1RfUkVHX1dSSVRFIChyZWdPZmZzZXQgKyA4LCBoaWdoKTsKKworCWlmIChiYW5rTGVuZ3RoICE9IDApIHsJLyogbXVzdCBkbyBBRlRFUiB3cml0aW5nIG1hcHMgKi8KKwkJR1RfUkVHX1dSSVRFIChyZW1hcE9mZnNldCwgcmVtYXBCYXNlID4+IDE2KTsJLyogc29ycnksIDMyIGJpdHMgb25seS4KKwkJCQkJCQkJICAgZG9udCBzdXBwb3J0IHVwcGVyIDMyCisJCQkJCQkJCSAgIGluIHRoaXMgZHJpdmVyICovCisJfQorCXJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBpbnQgcGNpR2V0U3BhY2VCYXNlIChQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbikKK3sKKwl1bnNpZ25lZCBpbnQgbG93OworCXVuc2lnbmVkIGludCByZWdPZmZzZXQgPSBwY2lHZXRSZWdPZmZzZXQgKGhvc3QsIHJlZ2lvbik7CisKKwlHVF9SRUdfUkVBRCAocmVnT2Zmc2V0LCAmbG93KTsKKwlyZXR1cm4gKGxvdyAmIDB4ZmZmZikgPDwgMTY7Cit9CisKK3Vuc2lnbmVkIGludCBwY2lHZXRTcGFjZVNpemUgKFBDSV9IT1NUIGhvc3QsIFBDSV9SRUdJT04gcmVnaW9uKQoreworCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJdW5zaWduZWQgaW50IHJlZ09mZnNldCA9IHBjaUdldFJlZ09mZnNldCAoaG9zdCwgcmVnaW9uKTsKKworCUdUX1JFR19SRUFEIChyZWdPZmZzZXQsICZsb3cpOworCUdUX1JFR19SRUFEIChyZWdPZmZzZXQgKyA4LCAmaGlnaCk7CisJcmV0dXJuICgoaGlnaCAmIDB4ZmZmZikgKyAxKSA8PCAxNjsKK30KKworCisvKiByb25lbiAtIDcvRGVjLzAzKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBndFBjaURpc2FibGUvRW5hYmxlSW50ZXJuYWxCQVIgLSBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIFBDSSBCQVJTLgorKiBJbnB1dHM6IG9uZSBvZiB0aGUgUENJIEJBUgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBndFBjaUVuYWJsZUludGVybmFsQkFSIChQQ0lfSE9TVCBob3N0LCBQQ0lfSU5URVJOQUxfQkFSIHBjaUJBUikKK3sKKwlSRVNFVF9SRUdfQklUUyAocGNpX2FkZHJlc3Nfc3BhY2VfZW5baG9zdF0sIEJJVDAgPDwgcGNpQkFSKTsKK30KKwordm9pZCBndFBjaURpc2FibGVJbnRlcm5hbEJBUiAoUENJX0hPU1QgaG9zdCwgUENJX0lOVEVSTkFMX0JBUiBwY2lCQVIpCit7CisJU0VUX1JFR19CSVRTIChwY2lfYWRkcmVzc19zcGFjZV9lbltob3N0XSwgQklUMCA8PCBwY2lCQVIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpTWFwTWVtb3J5QmFuayAtIE1hcHMgUENJX2hvc3QgbWVtb3J5IGJhbmsgImJhbmsiIGZvciB0aGUgc2xhdmUuCisqCisqIElucHV0czogYmFzZSBhbmQgc2l6ZSBvZiBQQ0kgU0NTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBjaU1hcE1lbW9yeUJhbmsgKFBDSV9IT1NUIGhvc3QsIE1FTU9SWV9CQU5LIGJhbmssCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpRHJhbUJhc2UsIHVuc2lnbmVkIGludCBwY2lEcmFtU2l6ZSkKK3sKKwkvKnJvbmVuIGRpZmZlcmVudCBmdW5jdGlvbiBmb3IgM3JkIGJhbmsuICovCisJdW5zaWduZWQgaW50IG9mZnNldCA9IChiYW5rIDwgMikgPyBiYW5rICogOCA6IDB4MTAwICsgKGJhbmsgLSAyKSAqIDg7CisKKwlwY2lEcmFtQmFzZSA9IHBjaURyYW1CYXNlICYgMHhmZmZmZjAwMDsKKwlwY2lEcmFtQmFzZSA9IHBjaURyYW1CYXNlIHwgKHBjaVJlYWRDb25maWdSZWcgKGhvc3QsCisJCQkJCQkgICAgICAgUENJX1NDU18wX0JBU0VfQUREUkVTUworCQkJCQkJICAgICAgICsgb2Zmc2V0LAorCQkJCQkJICAgICAgIFNFTEYpICYgMHgwMDAwMGZmZik7CisJcGNpV3JpdGVDb25maWdSZWcgKGhvc3QsIFBDSV9TQ1NfMF9CQVNFX0FERFJFU1MgKyBvZmZzZXQsIFNFTEYsCisJCQkgICBwY2lEcmFtQmFzZSk7CisJaWYgKHBjaURyYW1TaXplID09IDApCisJCXBjaURyYW1TaXplKys7CisJR1RfUkVHX1dSSVRFIChwY2lfc2NzX2Jhbmtfc2l6ZVtob3N0XVtiYW5rXSwgcGNpRHJhbVNpemUgLSAxKTsKKwlndFBjaUVuYWJsZUludGVybmFsQkFSIChob3N0LCBiYW5rKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVNldFJlZ2lvbkZlYXR1cmVzIC0gVGhpcyBmdW5jdGlvbiBtb2RpZnlzIG9uZSBvZiB0aGUgOCByZWdpb25zIHdpdGgKKyogICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBiaXRzIGdpdmVuIGFzIGFuIGlucHV0LgorKiAgICAgICAgICAgICAgICAgICAgICAgLSBCZSBhZHZpc2VkIHRvIGNoZWNrIHRoZSBzcGVjIGJlZm9yZSBtb2RpZnlpbmcgdGhlbS4KKyogSW5wdXRzOiBQQ0lfUFJPVEVDVF9SRUdJT04gcmVnaW9uIC0gb25lIG9mIHRoZSBlaWdodCByZWdpb25zLgorKiAgICAgICAgIHVuc2lnbmVkIGludCBmZWF0dXJlcyAtIFNlZSBmaWxlOiBwY2kuaCB0aGVyZSBhcmUgZGVmaW50aW9uIGZvciB0aG9zZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiBmZWF0dXJlcy4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MgLSBUaGUgcmVnaW9uIGJhc2UgQWRkcmVzcy4KKyogICAgICAgICB1bnNpZ25lZCBpbnQgdG9wQWRkcmVzcyAtIFRoZSByZWdpb24gdG9wIEFkZHJlc3MuCisqIFJldHVybnM6IGZhbHNlIGlmIG9uZSBvZiB0aGUgcGFyYW1ldGVycyBpcyBlcnJvbmVvdXMgdHJ1ZSBvdGhlcndpc2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVNldFJlZ2lvbkZlYXR1cmVzIChQQ0lfSE9TVCBob3N0LCBQQ0lfQUNDRVNTX1JFR0lPTlMgcmVnaW9uLAorCQkJICAgdW5zaWduZWQgaW50IGZlYXR1cmVzLCB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsCisJCQkgICB1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBhY2Nlc3NMb3c7CisJdW5zaWduZWQgaW50IGFjY2Vzc0hpZ2g7CisJdW5zaWduZWQgaW50IGFjY2Vzc1RvcCA9IGJhc2VBZGRyZXNzICsgcmVnaW9uTGVuZ3RoOworCisJaWYgKHJlZ2lvbkxlbmd0aCA9PSAwKSB7CS8qIGNsb3NlIHRoZSByZWdpb24uICovCisJCXBjaURpc2FibGVBY2Nlc3NSZWdpb24gKGhvc3QsIHJlZ2lvbik7CisJCXJldHVybiB0cnVlOworCX0KKwkvKiBiYXNlIEFkZHJlc3MgaXMgc3RvcmUgaXMgYml0cyBbMTE6MF0gKi8KKwlhY2Nlc3NMb3cgPSAoYmFzZUFkZHJlc3MgJiAweGZmZjAwMDAwKSA+PiAyMDsKKwkvKiBBbGwgdGhlIGZlYXR1cmVzIGFyZSB1cGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbmVzIGluIHBjaS5oICh0byBiZSBvbgorCSAgIHRoZSBzYWZlIHNpZGUgd2UgZGlzYWJsZSBiaXRzOiBbMTE6MF0gKi8KKwlhY2Nlc3NMb3cgPSBhY2Nlc3NMb3cgfCAoZmVhdHVyZXMgJiAweGZmZmZmMDAwKTsKKwkvKiB3cml0ZSB0byB0aGUgTG93IEFjY2VzcyBSZWdpb24gcmVnaXN0ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKHBjaV9hY2Nlc3NfY29udHJvbF9iYXNlXzBfbG93W2hvc3RdICsgMHgxMCAqIHJlZ2lvbiwKKwkJICAgICAgYWNjZXNzTG93KTsKKworCWFjY2Vzc0hpZ2ggPSAoYWNjZXNzVG9wICYgMHhmZmYwMDAwMCkgPj4gMjA7CisKKwkvKiB3cml0ZSB0byB0aGUgSGlnaCBBY2Nlc3MgUmVnaW9uIHJlZ2lzdGVyICovCisJR1RfUkVHX1dSSVRFIChwY2lfYWNjZXNzX2NvbnRyb2xfdG9wXzBbaG9zdF0gKyAweDEwICogcmVnaW9uLAorCQkgICAgICBhY2Nlc3NIaWdoIC0gMSk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lEaXNhYmxlQWNjZXNzUmVnaW9uIC0gRGlzYWJsZSBUaGUgZ2l2ZW4gUmVnaW9uIGJ5IHdyaXRpbmcgTUFYIHNpemUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpdHMgbG93IEFkZHJlc3MgYW5kIE1JTiBzaXplIHRvIGl0cyBoaWdoIEFkZHJlc3MuCisqCisqIElucHV0czogICBQQ0lfQUNDRVNTX1JFR0lPTlMgcmVnaW9uIC0gVGhlIHJlZ2lvbiB3ZSB0byBiZSBEaXNhYmxlZC4KKyogUmV0dXJuczogIE4vQS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGNpRGlzYWJsZUFjY2Vzc1JlZ2lvbiAoUENJX0hPU1QgaG9zdCwgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbikKK3sKKwkvKiB3cml0aW5nIGJhY2sgdGhlIHJlZ2lzdGVycyBkZWZhdWx0IHZhbHVlcy4gKi8KKwlHVF9SRUdfV1JJVEUgKHBjaV9hY2Nlc3NfY29udHJvbF9iYXNlXzBfbG93W2hvc3RdICsgMHgxMCAqIHJlZ2lvbiwKKwkJICAgICAgMHgwMTAwMWZmZik7CisJR1RfUkVHX1dSSVRFIChwY2lfYWNjZXNzX2NvbnRyb2xfdG9wXzBbaG9zdF0gKyAweDEwICogcmVnaW9uLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaUFyYml0ZXJFbmFibGUgLSBFbmFibGVzIFBDSS0wYHMgQXJiaXRyYXRpb24gbWVjaGFuaXNtLgorKgorKiBJbnB1dHM6ICAgTi9BCisqIFJldHVybnM6ICB0cnVlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lBcmJpdGVyRW5hYmxlIChQQ0lfSE9TVCBob3N0KQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCisJR1RfUkVHX1JFQUQgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sICZyZWdEYXRhKTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sIHJlZ0RhdGEgfCBCSVQzMSk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwY2lBcmJpdGVyRGlzYWJsZSAtIERpc2FibGUgUENJLTBgcyBBcmJpdHJhdGlvbiBtZWNoYW5pc20uCisqCisqIElucHV0czogICBOL0EKKyogUmV0dXJuczogIHRydWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpQXJiaXRlckRpc2FibGUgKFBDSV9IT1NUIGhvc3QpCit7CisJdW5zaWduZWQgaW50IHJlZ0RhdGE7CisKKwlHVF9SRUdfUkVBRCAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgJnJlZ0RhdGEpOworCUdUX1JFR19XUklURSAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgcmVnRGF0YSAmIDB4N2ZmZmZmZmYpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpU2V0QXJiaXRlckFnZW50c1ByaW9yaXR5IC0gUHJpb3JpdHkgc2V0dXAgZm9yIHRoZSBQQ0kgYWdlbnRzIChIaSBvciBMb3cpCisqCisqIElucHV0czogICBQQ0lfQUdFTlRfUFJJTyBpbnRlcm5hbEFnZW50IC0gcHJpb3RpdHkgZm9yIGludGVybmFsIGFnZW50LgorKiAgICAgICAgICAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDAgLSBwcmlvdGl0eSBmb3IgZXh0ZXJuYWwjMCBhZ2VudC4KKyogICAgICAgICAgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQxIC0gcHJpb3RpdHkgZm9yIGV4dGVybmFsIzEgYWdlbnQuCisqICAgICAgICAgICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MiAtIHByaW90aXR5IGZvciBleHRlcm5hbCMyIGFnZW50LgorKiAgICAgICAgICAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDMgLSBwcmlvdGl0eSBmb3IgZXh0ZXJuYWwjMyBhZ2VudC4KKyogICAgICAgICAgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQ0IC0gcHJpb3RpdHkgZm9yIGV4dGVybmFsIzQgYWdlbnQuCisqICAgICAgICAgICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50NSAtIHByaW90aXR5IGZvciBleHRlcm5hbCM1IGFnZW50LgorKiBSZXR1cm5zOiAgdHJ1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBwY2lTZXRBcmJpdGVyQWdlbnRzUHJpb3JpdHkgKFBDSV9IT1NUIGhvc3QsIFBDSV9BR0VOVF9QUklPIGludGVybmFsQWdlbnQsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MCwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQxLAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDIsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MywKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQ0LAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDUpCit7CisJdW5zaWduZWQgaW50IHJlZ0RhdGE7CisJdW5zaWduZWQgaW50IHdyaXRlRGF0YTsKKworCUdUX1JFR19SRUFEIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCAmcmVnRGF0YSk7CisJd3JpdGVEYXRhID0gKGludGVybmFsQWdlbnQgPDwgNykgKyAoZXh0ZXJuYWxBZ2VudDAgPDwgOCkgKworCQkoZXh0ZXJuYWxBZ2VudDEgPDwgOSkgKyAoZXh0ZXJuYWxBZ2VudDIgPDwgMTApICsKKwkJKGV4dGVybmFsQWdlbnQzIDw8IDExKSArIChleHRlcm5hbEFnZW50NCA8PCAxMikgKworCQkoZXh0ZXJuYWxBZ2VudDUgPDwgMTMpOworCXJlZ0RhdGEgPSAocmVnRGF0YSAmIDB4ZmZmZmMwN2YpIHwgd3JpdGVEYXRhOworCUdUX1JFR19XUklURSAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgcmVnRGF0YSAmIHJlZ0RhdGEpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpUGFya2luZ0Rpc2FibGUgLSBQYXJrIG9uIGxhc3Qgb3B0aW9uIGRpc2FibGUsIHdpdGggdGhpcyBmdW5jdGlvbiB5b3UgY2FuCisqICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIHBhcmsgb24gbGFzdCBtZWNoYW5pc20gZm9yIGVhY2ggYWdlbnQuCisqICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGluZyB0aGlzIG9wdGlvbiBmb3IgYWxsIGFnZW50cyByZXN1bHRzIHBhcmtpbmcKKyogICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGludGVybmFsIG1hc3Rlci4KKyoKKyogSW5wdXRzOiBQQ0lfQUdFTlRfUEFSSyBpbnRlcm5hbEFnZW50IC0gIHBhcmtpbmcgRGlzYWJsZSBmb3IgaW50ZXJuYWwgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDAgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzAgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDEgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzEgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDIgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzIgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDMgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzMgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDQgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzQgYWdlbnQuCisqICAgICAgICAgUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDUgLSBwYXJraW5nIERpc2FibGUgZm9yIGV4dGVybmFsIzUgYWdlbnQuCisqIFJldHVybnM6ICB0cnVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVBhcmtpbmdEaXNhYmxlIChQQ0lfSE9TVCBob3N0LCBQQ0lfQUdFTlRfUEFSSyBpbnRlcm5hbEFnZW50LAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDAsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MSwKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQyLAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDMsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50NCwKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQ1KQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCXVuc2lnbmVkIGludCB3cml0ZURhdGE7CisKKwlHVF9SRUdfUkVBRCAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgJnJlZ0RhdGEpOworCXdyaXRlRGF0YSA9IChpbnRlcm5hbEFnZW50IDw8IDE0KSArIChleHRlcm5hbEFnZW50MCA8PCAxNSkgKworCQkoZXh0ZXJuYWxBZ2VudDEgPDwgMTYpICsgKGV4dGVybmFsQWdlbnQyIDw8IDE3KSArCisJCShleHRlcm5hbEFnZW50MyA8PCAxOCkgKyAoZXh0ZXJuYWxBZ2VudDQgPDwgMTkpICsKKwkJKGV4dGVybmFsQWdlbnQ1IDw8IDIwKTsKKwlyZWdEYXRhID0gKHJlZ0RhdGEgJiB+KDB4N2YgPDwgMTQpKSB8IHdyaXRlRGF0YTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sIHJlZ0RhdGEpOworCXJldHVybiB0cnVlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGNpRW5hYmxlQnJva2VuQWdlbnREZXRlY3Rpb24gLSBBIG1hc3RlciBpcyBzYWlkIHRvIGJlIGJyb2tlbiBpZiBpdCBmYWlscyB0bworKiAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZCB0byBncmFudCBhc3NlcnRpb24gd2l0aGluIGEgd2luZG93IHNwZWNpZmllZCBpbgorKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHZhbHVlOiAnYnJva2VuVmFsdWUnLgorKgorKiBJbnB1dHM6IHVuc2lnbmVkIGNoYXIgYnJva2VuVmFsdWUgLSAgQSB2YWx1ZSB3aGljaCBsaW1pdHMgdGhlIE1hc3RlciB0byBob2xkIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgZ3JhbnQgd2l0aG91dCBhc3NlcnRpbmcgZnJhbWUuCisqIFJldHVybnM6ICBFcnJvciBmb3IgaWxsZWdhbCBicm9rZW4gdmFsdWUgb3RoZXJ3aXNlIHRydWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaUVuYWJsZUJyb2tlbkFnZW50RGV0ZWN0aW9uIChQQ0lfSE9TVCBob3N0LCB1bnNpZ25lZCBjaGFyIGJyb2tlblZhbHVlKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCByZWdEYXRhOworCisJaWYgKGJyb2tlblZhbHVlID4gMHhmKQorCQlyZXR1cm4gZmFsc2U7CS8qIGJyb2tlblZhbHVlIG11c3QgYmUgNCBiaXQgKi8KKwlkYXRhID0gYnJva2VuVmFsdWUgPDwgMzsKKwlHVF9SRUdfUkVBRCAocGNpX2FyYml0ZXJfY29udHJvbFtob3N0XSwgJnJlZ0RhdGEpOworCXJlZ0RhdGEgPSAocmVnRGF0YSAmIDB4ZmZmZmZmODcpIHwgZGF0YTsKKwlHVF9SRUdfV1JJVEUgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sIHJlZ0RhdGEgfCBCSVQxKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaURpc2FibGVCcm9rZW5BZ2VudERldGVjdGlvbiAtIFRoaXMgZnVuY3Rpb24gZGlzYWJsZSB0aGUgQnJva2VuIGFnZW50CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV0ZWN0aW9uIG1lY2hhbmlzbS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGlzIG9wZXJhdGlvbiBtYXkgY2F1c2UgYSBkZWFkIGxvY2sgb24gdGhlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpMCBhcmJpdHJhdGlvbi4KKyoKKyogSW5wdXRzOiAgIE4vQQorKiBSZXR1cm5zOiAgdHJ1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpRGlzYWJsZUJyb2tlbkFnZW50RGV0ZWN0aW9uIChQQ0lfSE9TVCBob3N0KQoreworCXVuc2lnbmVkIGludCByZWdEYXRhOworCisJR1RfUkVHX1JFQUQgKHBjaV9hcmJpdGVyX2NvbnRyb2xbaG9zdF0sICZyZWdEYXRhKTsKKwlyZWdEYXRhID0gcmVnRGF0YSAmIDB4ZmZmZmZmZmQ7CisJR1RfUkVHX1dSSVRFIChwY2lfYXJiaXRlcl9jb250cm9sW2hvc3RdLCByZWdEYXRhKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVAyUENvbmZpZyAtIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBQQ0lfbiBQMlAgY29uZmlndXJhdGUuCisqICAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgUDJQIHJlYWQgUENJIHNwZWMuCisqCisqIElucHV0czogIHVuc2lnbmVkIGludCBTZWNvbmRCdXNMb3cgLSBTZWNvbmRlcnkgUENJIGludGVyZmFjZSBCdXMgUmFuZ2UgTG93ZXIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kcnkuCisqICAgICAgICAgIHVuc2lnbmVkIGludCBTZWNvbmRCdXNIaWdoIC0gU2Vjb25kcnkgUENJIGludGVyZmFjZSBCdXMgUmFuZ2UgdXBwZXIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kcnkuCisqICAgICAgICAgIHVuc2lnbmVkIGludCBidXNOdW0gLSBUaGUgQ1BJIGJ1cyBudW1iZXIgdG8gd2hpY2ggdGhlIFBDSSBpbnRlcmZhY2UKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNvbm5lY3RlZC4KKyogICAgICAgICAgdW5zaWduZWQgaW50IGRldk51bSAtIFRoZSBQQ0kgaW50ZXJmYWNlJ3MgZGV2aWNlIG51bWJlci4KKyoKKyogUmV0dXJuczogIHRydWUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIHBjaVAyUENvbmZpZyAoUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgaW50IFNlY29uZEJ1c0xvdywKKwkJICAgdW5zaWduZWQgaW50IFNlY29uZEJ1c0hpZ2gsCisJCSAgIHVuc2lnbmVkIGludCBidXNOdW0sIHVuc2lnbmVkIGludCBkZXZOdW0pCit7CisJdW5zaWduZWQgaW50IHJlZ0RhdGE7CisKKwlyZWdEYXRhID0gKFNlY29uZEJ1c0xvdyAmIDB4ZmYpIHwgKChTZWNvbmRCdXNIaWdoICYgMHhmZikgPDwgOCkgfAorCQkoKGJ1c051bSAmIDB4ZmYpIDw8IDE2KSB8ICgoZGV2TnVtICYgMHgxZikgPDwgMjQpOworCUdUX1JFR19XUklURSAocGNpX3AycF9jb25maWd1cmF0aW9uW2hvc3RdLCByZWdEYXRhKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHBjaVNldFJlZ2lvblNub29wTW9kZSAtIFRoaXMgZnVuY3Rpb24gbW9kaWZ5cyBvbmUgb2YgdGhlIDQgcmVnaW9ucyB3aGljaAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgQ2FjaGUgQ29oZXJlbmN5IGluIHRoZSBQQ0lfbiBpbnRlcmZhY2UuCisqIElucHV0czogcmVnaW9uIC0gT25lIG9mIHRoZSBmb3VyIHJlZ2lvbnMuCisqICAgICAgICAgc25vb3BUeXBlIC0gVGhlcmUgaXMgZm91ciBvcHRpb25hbCBUeXBlczoKKyogICAgICAgICAgICAgICAgICAgICAgICAxLiBObyBTbm9vcC4KKyogICAgICAgICAgICAgICAgICAgICAgICAyLiBTbm9vcCB0byBXVCByZWdpb24uCisqICAgICAgICAgICAgICAgICAgICAgICAgMy4gU25vb3AgdG8gV0IgcmVnaW9uLgorKiAgICAgICAgICAgICAgICAgICAgICAgIDQuIFNub29wICYgSW52YWxpZGF0ZSB0byBXQiByZWdpb24uCisqICAgICAgICAgYmFzZUFkZHJlc3MgLSBCYXNlIEFkZHJlc3Mgb2YgdGhpcyByZWdpb24uCisqICAgICAgICAgcmVnaW9uTGVuZ3RoIC0gUmVnaW9uIGxlbmd0aC4KKyogUmV0dXJuczogZmFsc2UgaWYgb25lIG9mIHRoZSBwYXJhbWV0ZXJzIGlzIHdyb25nIG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgcGNpU2V0UmVnaW9uU25vb3BNb2RlIChQQ0lfSE9TVCBob3N0LCBQQ0lfU05PT1BfUkVHSU9OIHJlZ2lvbiwKKwkJCSAgICBQQ0lfU05PT1BfVFlQRSBzbm9vcFR5cGUsCisJCQkgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLAorCQkJICAgIHVuc2lnbmVkIGludCByZWdpb25MZW5ndGgpCit7CisJdW5zaWduZWQgaW50IHNub29wWGJhc2VBZGRyZXNzOworCXVuc2lnbmVkIGludCBzbm9vcFh0b3BBZGRyZXNzOworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCBzbm9vcEhpZ2ggPSBiYXNlQWRkcmVzcyArIHJlZ2lvbkxlbmd0aDsKKworCWlmICgocmVnaW9uID4gUENJX1NOT09QX1JFR0lPTjMpIHx8IChzbm9vcFR5cGUgPiBQQ0lfU05PT1BfV0IpKQorCQlyZXR1cm4gZmFsc2U7CisJc25vb3BYYmFzZUFkZHJlc3MgPQorCQlwY2lfc25vb3BfY29udHJvbF9iYXNlXzBfbG93W2hvc3RdICsgMHgxMCAqIHJlZ2lvbjsKKwlzbm9vcFh0b3BBZGRyZXNzID0gcGNpX3Nub29wX2NvbnRyb2xfdG9wXzBbaG9zdF0gKyAweDEwICogcmVnaW9uOworCWlmIChyZWdpb25MZW5ndGggPT0gMCkgewkvKiBjbG9zaW5nIHRoZSByZWdpb24gKi8KKwkJR1RfUkVHX1dSSVRFIChzbm9vcFhiYXNlQWRkcmVzcywgMHgwMDAwZmZmZik7CisJCUdUX1JFR19XUklURSAoc25vb3BYdG9wQWRkcmVzcywgMCk7CisJCXJldHVybiB0cnVlOworCX0KKwliYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzICYgMHhmZmYwMDAwMDsJLyogR3JhbnVsYXJpdHkgb2YgMU1CeXRlICovCisJZGF0YSA9IChiYXNlQWRkcmVzcyA+PiAyMCkgfCBzbm9vcFR5cGUgPDwgMTI7CisJR1RfUkVHX1dSSVRFIChzbm9vcFhiYXNlQWRkcmVzcywgZGF0YSk7CisJc25vb3BIaWdoID0gKHNub29wSGlnaCAmIDB4ZmZmMDAwMDApID4+IDIwOworCUdUX1JFR19XUklURSAoc25vb3BYdG9wQWRkcmVzcywgc25vb3BIaWdoIC0gMSk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZ3RfcmVhZF9jb25maWdfZHdvcmQgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgcGNpX2Rldl90IGRldiwgaW50IG9mZnNldCwgdTMyICogdmFsdWUpCit7CisJaW50IGJ1cyA9IFBDSV9CVVMgKGRldik7CisKKwlpZiAoKGJ1cyA9PSBsb2NhbF9idXNlc1swXSkgfHwgKGJ1cyA9PSBsb2NhbF9idXNlc1sxXSkpIHsKKwkJKnZhbHVlID0gcGNpUmVhZENvbmZpZ1JlZyAoKFBDSV9IT1NUKSBob3NlLT5jZmdfYWRkciwgb2Zmc2V0LAorCQkJCQkgICBQQ0lfREVWIChkZXYpKTsKKwl9IGVsc2UgeworCQkqdmFsdWUgPSBwY2lPdmVyQnJpZGdlUmVhZENvbmZpZ1JlZyAoKFBDSV9IT1NUKSBob3NlLT4KKwkJCQkJCSAgICAgY2ZnX2FkZHIsIG9mZnNldCwKKwkJCQkJCSAgICAgUENJX0RFViAoZGV2KSwgYnVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBndF93cml0ZV9jb25maWdfZHdvcmQgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkgIHBjaV9kZXZfdCBkZXYsIGludCBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgYnVzID0gUENJX0JVUyAoZGV2KTsKKworCWlmICgoYnVzID09IGxvY2FsX2J1c2VzWzBdKSB8fCAoYnVzID09IGxvY2FsX2J1c2VzWzFdKSkgeworCQlwY2lXcml0ZUNvbmZpZ1JlZyAoKFBDSV9IT1NUKSBob3NlLT5jZmdfYWRkciwgb2Zmc2V0LAorCQkJCSAgIFBDSV9ERVYgKGRldiksIHZhbHVlKTsKKwl9IGVsc2UgeworCQlwY2lPdmVyQnJpZGdlV3JpdGVDb25maWdSZWcgKChQQ0lfSE9TVCkgaG9zZS0+Y2ZnX2FkZHIsCisJCQkJCSAgICAgb2Zmc2V0LCBQQ0lfREVWIChkZXYpLCBidXMsCisJCQkJCSAgICAgdmFsdWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBndF9zZXR1cF9pZGUgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCSAgcGNpX2Rldl90IGRldiwgc3RydWN0IHBjaV9jb25maWdfdGFibGUgKmVudHJ5KQoreworCXN0YXRpYyBjb25zdCBpbnQgaWRlX2JhcltdID0geyA4LCA0LCA4LCA0LCAwLCAwIH07CisJdTMyIGJhcl9yZXNwb25zZSwgYmFyX3ZhbHVlOworCWludCBiYXI7CisKKwlmb3IgKGJhciA9IDA7IGJhciA8IDY7IGJhcisrKSB7CisJCS8qcm9uZW4gZGlmZmVyZW50IGZ1bmN0aW9uIGZvciAzcmQgYmFuay4gKi8KKwkJdW5zaWduZWQgaW50IG9mZnNldCA9CisJCQkoYmFyIDwgMikgPyBiYXIgKiA4IDogMHgxMDAgKyAoYmFyIC0gMikgKiA4OworCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgb2Zmc2V0LAorCQkJCQkweDApOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgb2Zmc2V0LAorCQkJCSAgICAgICAmYmFyX3Jlc3BvbnNlKTsKKworCQlwY2lhdXRvX3JlZ2lvbl9hbGxvY2F0ZSAoYmFyX3Jlc3BvbnNlICYKKwkJCQkJIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gPyBob3NlLT4KKwkJCQkJIHBjaV9pbyA6IGhvc2UtPnBjaV9tZW0sIGlkZV9iYXJbYmFyXSwKKwkJCQkJICZiYXJfdmFsdWUpOworCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKGRldiwgUENJX0JBU0VfQUREUkVTU18wICsgYmFyICogNCwKKwkJCQkJYmFyX3ZhbHVlKTsKKwl9Cit9CisKKworLyogVE9ETyBCSlc6IENoYW5nZSB0aGlzIGZvciBEQjY0MzYwLiBUaGlzIHdhcyBwdWxsZWQgZnJvbSB0aGUgRVY2NDI2MCAgKi8KKy8qIGFuZCBpcyBjdXJlbnRseSBub3QgY2FsbGVkICouICovCisjaWYgMAorc3RhdGljIHZvaWQgZ3RfZml4dXBfaXJxIChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHBjaV9kZXZfdCBkZXYpCit7CisJdW5zaWduZWQgY2hhciBwaW4sIGlycTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKKworCWlmIChwaW4gPT0gMSkgewkJLyogb25seSBhbGxvdyBJTlQgQSAqLworCQlpcnEgPSBwY2lfaXJxX3N3aXp6bGVbKFBDSV9IT1NUKSBob3NlLT4KKwkJCQkgICAgICBjZmdfYWRkcl1bUENJX0RFViAoZGV2KV07CisJCWlmIChpcnEpCisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworCX0KK30KKyNlbmRpZgorCitzdHJ1Y3QgcGNpX2NvbmZpZ190YWJsZSBndF9jb25maWdfdGFibGVbXSA9IHsKKwl7UENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX1NUT1JBR0VfSURFLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBndF9zZXR1cF9pZGV9LAorCisJe30KK307CisKK3N0cnVjdCBwY2lfY29udHJvbGxlciBwY2kwX2hvc2UgPSB7CisvKiAgICBmaXh1cF9pcnE6IGd0X2ZpeHVwX2lycSwgKi8KKwljb25maWdfdGFibGU6Z3RfY29uZmlnX3RhYmxlLAorfTsKKworc3RydWN0IHBjaV9jb250cm9sbGVyIHBjaTFfaG9zZSA9IHsKKy8qICAgIGZpeHVwX2lycTogZ3RfZml4dXBfaXJxLCAqLworCWNvbmZpZ190YWJsZTpndF9jb25maWdfdGFibGUsCit9OworCit2b2lkIHBjaV9pbml0X2JvYXJkICh2b2lkKQoreworCXVuc2lnbmVkIGludCBjb21tYW5kOworCisjaWZkZWYgREVCVUcKKwlndF9wY2lfYnVzX21vZGVfZGlzcGxheSAoUENJX0hPU1QwKTsKKyNlbmRpZgorCisJcGNpMF9ob3NlLmZpcnN0X2J1c25vID0gMDsKKwlwY2kwX2hvc2UubGFzdF9idXNubyA9IDB4ZmY7CisJbG9jYWxfYnVzZXNbMF0gPSBwY2kwX2hvc2UuZmlyc3RfYnVzbm87CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24gKHBjaTBfaG9zZS5yZWdpb25zICsgMCwKKwkJCUNGR19QQ0kwXzBfTUVNX1NQQUNFLAorCQkJQ0ZHX1BDSTBfMF9NRU1fU1BBQ0UsCisJCQlDRkdfUENJMF9NRU1fU0laRSwgUENJX1JFR0lPTl9NRU0pOworCisJLyogUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uIChwY2kwX2hvc2UucmVnaW9ucyArIDEsCisJCQlDRkdfUENJMF9JT19TUEFDRV9QQ0ksCisJCQlDRkdfUENJMF9JT19TUEFDRSwgQ0ZHX1BDSTBfSU9fU0laRSwgUENJX1JFR0lPTl9JTyk7CisKKwlwY2lfc2V0X29wcyAoJnBjaTBfaG9zZSwKKwkJICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkJICAgICBwY2lfaG9zZV9yZWFkX2NvbmZpZ193b3JkX3ZpYV9kd29yZCwKKwkJICAgICBndF9yZWFkX2NvbmZpZ19kd29yZCwKKwkJICAgICBwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZV92aWFfZHdvcmQsCisJCSAgICAgcGNpX2hvc2Vfd3JpdGVfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQkgICAgIGd0X3dyaXRlX2NvbmZpZ19kd29yZCk7CisJcGNpMF9ob3NlLnJlZ2lvbl9jb3VudCA9IDI7CisKKwlwY2kwX2hvc2UuY2ZnX2FkZHIgPSAodW5zaWduZWQgaW50ICopIFBDSV9IT1NUMDsKKworCXBjaV9yZWdpc3Rlcl9ob3NlICgmcGNpMF9ob3NlKTsKKwlwY2lBcmJpdGVyRW5hYmxlIChQQ0lfSE9TVDApOworCXBjaVBhcmtpbmdEaXNhYmxlIChQQ0lfSE9TVDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEpOworCWNvbW1hbmQgPSBwY2lSZWFkQ29uZmlnUmVnIChQQ0lfSE9TVDAsIFBDSV9DT01NQU5ELCBTRUxGKTsKKwljb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwlwY2lXcml0ZUNvbmZpZ1JlZyAoUENJX0hPU1QwLCBQQ0lfQ09NTUFORCwgU0VMRiwgY29tbWFuZCk7CisJY29tbWFuZCA9IHBjaVJlYWRDb25maWdSZWcgKFBDSV9IT1NUMCwgUENJX0NPTU1BTkQsIFNFTEYpOworCWNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCXBjaVdyaXRlQ29uZmlnUmVnIChQQ0lfSE9TVDAsIFBDSV9DT01NQU5ELCBTRUxGLCBjb21tYW5kKTsKKworCXBjaTBfaG9zZS5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbiAoJnBjaTBfaG9zZSk7CisKKyNpZmRlZiBERUJVRworCWd0X3BjaV9idXNfbW9kZV9kaXNwbGF5IChQQ0lfSE9TVDEpOworI2VuZGlmCisJcGNpMV9ob3NlLmZpcnN0X2J1c25vID0gcGNpMF9ob3NlLmxhc3RfYnVzbm8gKyAxOworCXBjaTFfaG9zZS5sYXN0X2J1c25vID0gMHhmZjsKKwlwY2kxX2hvc2UuY3VycmVudF9idXNubyA9IHBjaTFfaG9zZS5maXJzdF9idXNubzsKKwlsb2NhbF9idXNlc1sxXSA9IHBjaTFfaG9zZS5maXJzdF9idXNubzsKKworCS8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbiAocGNpMV9ob3NlLnJlZ2lvbnMgKyAwLAorCQkJQ0ZHX1BDSTFfMF9NRU1fU1BBQ0UsCisJCQlDRkdfUENJMV8wX01FTV9TUEFDRSwKKwkJCUNGR19QQ0kxX01FTV9TSVpFLCBQQ0lfUkVHSU9OX01FTSk7CisKKwkvKiBQQ0kgSS9PIHNwYWNlICovCisJcGNpX3NldF9yZWdpb24gKHBjaTFfaG9zZS5yZWdpb25zICsgMSwKKwkJCUNGR19QQ0kxX0lPX1NQQUNFX1BDSSwKKwkJCUNGR19QQ0kxX0lPX1NQQUNFLCBDRkdfUENJMV9JT19TSVpFLCBQQ0lfUkVHSU9OX0lPKTsKKworCXBjaV9zZXRfb3BzICgmcGNpMV9ob3NlLAorCQkgICAgIHBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGVfdmlhX2R3b3JkLAorCQkgICAgIHBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmRfdmlhX2R3b3JkLAorCQkgICAgIGd0X3JlYWRfY29uZmlnX2R3b3JkLAorCQkgICAgIHBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlX3ZpYV9kd29yZCwKKwkJICAgICBwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZF92aWFfZHdvcmQsCisJCSAgICAgZ3Rfd3JpdGVfY29uZmlnX2R3b3JkKTsKKworCXBjaTFfaG9zZS5yZWdpb25fY291bnQgPSAyOworCisJcGNpMV9ob3NlLmNmZ19hZGRyID0gKHVuc2lnbmVkIGludCAqKSBQQ0lfSE9TVDE7CisKKwlwY2lfcmVnaXN0ZXJfaG9zZSAoJnBjaTFfaG9zZSk7CisKKwlwY2lBcmJpdGVyRW5hYmxlIChQQ0lfSE9TVDEpOworCXBjaVBhcmtpbmdEaXNhYmxlIChQQ0lfSE9TVDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEpOworCisJY29tbWFuZCA9IHBjaVJlYWRDb25maWdSZWcgKFBDSV9IT1NUMSwgUENJX0NPTU1BTkQsIFNFTEYpOworCWNvbW1hbmQgfD0gUENJX0NPTU1BTkRfTUFTVEVSOworCXBjaVdyaXRlQ29uZmlnUmVnIChQQ0lfSE9TVDEsIFBDSV9DT01NQU5ELCBTRUxGLCBjb21tYW5kKTsKKworCXBjaTFfaG9zZS5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2NhbiAoJnBjaTFfaG9zZSk7CisKKwljb21tYW5kID0gcGNpUmVhZENvbmZpZ1JlZyAoUENJX0hPU1QxLCBQQ0lfQ09NTUFORCwgU0VMRik7CisJY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CisJcGNpV3JpdGVDb25maWdSZWcgKFBDSV9IT1NUMSwgUENJX0NPTU1BTkQsIFNFTEYsIGNvbW1hbmQpOworCit9CmRpZmYgLS1naXQgYS9ib2FyZC9NYXJ2ZWxsL2RiNjQ0NjAvc2RyYW1faW5pdC5jIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL3NkcmFtX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZlODRjCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL3NkcmFtX2luaXQuYwpAQCAtMCwwICsxLDE5ODUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIEpvc2ggSHViZXIgPGh1YmVyQG1jbHguY29tPiwgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgSW5jLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBhZGFwdGlvbiBmb3IgdGhlIE1hcnZlbGwgREI2NDQ2MCBCb2FyZAorICogSW5nbyBBc3NtdXMgKGluZ28uYXNzbXVzQGtleW1pbGUuY29tKQorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogc2RyYW1faW5pdC5jIC0gYXV0b21hdGljIG1lbW9yeSBzaXppbmcgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPDc0eHhfN3h4Lmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tZW1vcnkuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL3BjaS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbXZfZ2VuX3JlZy5oIgorI2luY2x1ZGUgPG5ldC5oPgorCisjaW5jbHVkZSAiZXRoLmgiCisjaW5jbHVkZSAibXBzYy5oIgorI2luY2x1ZGUgIi4uL2NvbW1vbi9pMmMuaCIKKyNpbmNsdWRlICI2NDQ2MC5oIgorI2luY2x1ZGUgIm12X3JlZ3MuaCIKKworI3VuZGVmCURFQlVHCisjZGVmaW5lCU1BUF9QQ0kKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQKHgpIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworaW50IHNldF9kZmNkbEluaXQgKHZvaWQpOwkvKiBzZXR1cCBkZWxheSBsaW5lIG9mIE12NjQ0NjAgKi8KK2ludCBtdkRtYUlzQ2hhbm5lbEFjdGl2ZSAoaW50KTsKK2ludCBtdkRtYVNldE1lbW9yeVNwYWNlICh1bG9uZywgdWxvbmcsIHVsb25nLCB1bG9uZywgdWxvbmcpOworaW50IG12RG1hVHJhbnNmZXIgKGludCwgdWxvbmcsIHVsb25nLCB1bG9uZywgdWxvbmcpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludAorbWVtb3J5X21hcF9iYW5rICh1bnNpZ25lZCBpbnQgYmFua05vLAorCQkgdW5zaWduZWQgaW50IGJhbmtCYXNlLCB1bnNpZ25lZCBpbnQgYmFua0xlbmd0aCkKK3sKKyNpZmRlZiBNQVBfUENJCisJUENJX0hPU1QgaG9zdDsKKyNlbmRpZgorCisKKyNpZmRlZiBERUJVRworCWlmIChiYW5rTGVuZ3RoID4gMCkgeworCQlwcmludGYgKCJtYXBwaW5nIGJhbmsgJWQgYXQgJTA4eCAtICUwOHhcbiIsCisJCQliYW5rTm8sIGJhbmtCYXNlLCBiYW5rQmFzZSArIGJhbmtMZW5ndGggLSAxKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJ1bm1hcHBpbmcgYmFuayAlZFxuIiwgYmFua05vKTsKKwl9CisjZW5kaWYKKworCW1lbW9yeU1hcEJhbmsgKGJhbmtObywgYmFua0Jhc2UsIGJhbmtMZW5ndGgpOworCisjaWZkZWYgTUFQX1BDSQorCWZvciAoaG9zdCA9IFBDSV9IT1NUMDsgaG9zdCA8PSBQQ0lfSE9TVDE7IGhvc3QrKykgeworCQljb25zdCBpbnQgZmVhdHVyZXMgPQorCQkJUFJFRkVUQ0hfRU5BQkxFIHwKKwkJCURFTEFZRURfUkVBRF9FTkFCTEUgfAorCQkJQUdHUkVTU0lWRV9QUkVGRVRDSCB8CisJCQlSRUFEX0xJTkVfQUdHUkVTU0lWRV9QUkVGRVRDSCB8CisJCQlSRUFEX01VTFRJX0FHR1JFU1NJVkVfUFJFRkVUQ0ggfAorCQkJTUFYX0JVUlNUXzQgfCBQQ0lfTk9fU1dBUDsKKworCQlwY2lNYXBNZW1vcnlCYW5rIChob3N0LCBiYW5rTm8sIGJhbmtCYXNlLCBiYW5rTGVuZ3RoKTsKKworCQlwY2lTZXRSZWdpb25Tbm9vcE1vZGUgKGhvc3QsIGJhbmtObywgUENJX1NOT09QX1dCLCBiYW5rQmFzZSwKKwkJCQkgICAgICAgYmFua0xlbmd0aCk7CisKKwkJcGNpU2V0UmVnaW9uRmVhdHVyZXMgKGhvc3QsIGJhbmtObywgZmVhdHVyZXMsIGJhbmtCYXNlLAorCQkJCSAgICAgIGJhbmtMZW5ndGgpOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjZGVmaW5lIEdCICAgICAgICAgKDEgPDwgMzApCisKKy8qIG11Y2ggb2YgdGhpcyBjb2RlIGlzIGJhc2VkIG9uIChvciBpcykgdGhlIGNvZGUgaW4gdGhlIHBpcDQwNSBwb3J0ICovCisvKiB0aGFua3MgZ28gdG8gdGhlIGF1dGhvcnMgb2Ygc2FpZCBwb3J0IC0gSm9zaCAqLworCisvKiBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGFib3V0IGFuIHNkcmFtIGJhbmsgKi8KK3R5cGVkZWYgc3RydWN0IHNkcmFtX2luZm8geworCXVjaGFyIGRyYl9zaXplOworCXVjaGFyIHJlZ2lzdGVyZWQsIGVjYzsKKwl1Y2hhciB0cGFyOworCXVjaGFyIHRyYXNfY2xvY2tzOworCXVjaGFyIGJ1cnN0X2xlbjsKKwl1Y2hhciBiYW5rcywgc2xvdDsKK30gc2RyYW1faW5mb190OworCisvKiBUeXBlZGVmcyBmb3IgJ2d0QXV4aWxHZXRESU1NaW5mbycgZnVuY3Rpb24gKi8KKwordHlwZWRlZiBlbnVtIF9tZW1vcnlUeXBlIHsgU0RSQU0sIEREUiB9IE1FTU9SWV9UWVBFOworCit0eXBlZGVmIGVudW0gX3ZvbHRhZ2VJbnRlcmZhY2UgeyBUVExfNVZfVE9MRVJBTlQsIExWVFRMLCBIU1RMXzFfNVYsCisJU1NUTF8zXzNWLCBTU1RMXzJfNVYsIFZPTFRBR0VfVU5LTk9XTiwKK30gVk9MVEFHRV9JTlRFUkZBQ0U7CisKK3R5cGVkZWYgZW51bSBfbWF4X0NMX3N1cHBvcnRlZF9ERFIgeyBERFJfQ0xfMSA9IDEsIEREUl9DTF8xXzUgPSAyLCBERFJfQ0xfMiA9CisJCTQsIEREUl9DTF8yXzUgPSA4LCBERFJfQ0xfMyA9IDE2LCBERFJfQ0xfM181ID0KKwkJMzIsIEREUl9DTF9GQVVMVCB9IE1BWF9DTF9TVVBQT1JURURfRERSOwordHlwZWRlZiBlbnVtIF9tYXhfQ0xfc3VwcG9ydGVkX1NEIHsgU0RfQ0xfMSA9CisJCTEsIFNEX0NMXzIsIFNEX0NMXzMsIFNEX0NMXzQsIFNEX0NMXzUsIFNEX0NMXzYsIFNEX0NMXzcsCisJCVNEX0ZBVUxUIH0gTUFYX0NMX1NVUFBPUlRFRF9TRDsKKworCisvKiBTRFJBTS9ERFIgaW5mb3JtYXRpb24gc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCBfZ3RNZW1vcnlEaW1tSW5mbyB7CisJTUVNT1JZX1RZUEUgbWVtb3J5VHlwZTsKKwl1bnNpZ25lZCBpbnQgbnVtT2ZSb3dBZGRyZXNzZXM7CisJdW5zaWduZWQgaW50IG51bU9mQ29sQWRkcmVzc2VzOworCXVuc2lnbmVkIGludCBudW1PZk1vZHVsZUJhbmtzOworCXVuc2lnbmVkIGludCBkYXRhV2lkdGg7CisJVk9MVEFHRV9JTlRFUkZBQ0Ugdm9sdGFnZUludGVyZmFjZTsKKwl1bnNpZ25lZCBpbnQgZXJyb3JDaGVja1R5cGU7CS8qIEVDQyAsIFBBUklUWS4uICovCisJdW5zaWduZWQgaW50IHNkcmFtV2lkdGg7IC8qIDQsOCwxNiBvciAzMiAqLyA7CisJdW5zaWduZWQgaW50IGVycm9yQ2hlY2tEYXRhV2lkdGg7CS8qIDAgLSBubywgMSAtIFllcyAqLworCXVuc2lnbmVkIGludCBtaW5DbGtEZWxheTsKKwl1bnNpZ25lZCBpbnQgYnVyc3RMZW5ndGhTdXBwb3J0ZWQ7CisJdW5zaWduZWQgaW50IG51bU9mQmFua3NPbkVhY2hEZXZpY2U7CisJdW5zaWduZWQgaW50IHN1cG9ydGVkQ2FzTGF0ZW5jaWVzOworCXVuc2lnbmVkIGludCBSZWZyZXNoSW50ZXJ2YWw7CisJdW5zaWduZWQgaW50IG1heENBU2xhdGVuY3lTdXBwb3J0ZWRfTG9QOwkvKiBMb1AgbGVmdCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IG1heENBU2xhdGVuY3lTdXBwb3J0ZWRfUm9QOwkvKiBSb1AgcmlnaHQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCU1BWF9DTF9TVVBQT1JURURfRERSIG1heENsU3VwcG9ydGVkX0REUjsKKwlNQVhfQ0xfU1VQUE9SVEVEX1NEIG1heENsU3VwcG9ydGVkX1NEOworCXVuc2lnbmVkIGludCBtb2R1bGVCYW5rRGVuc2l0eTsKKwkvKiBtb2R1bGUgYXR0cmlidXRlcyAodHJ1ZSBmb3IgeWVzKSAqLworCWJvb2wgYnVmZmVyZWRBZGRyQW5kQ29udHJvbElucHV0czsKKwlib29sIHJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0czsKKwlib29sIG9uQ2FyZFBMTDsKKwlib29sIGJ1ZmZlcmVkRFFNQmlucHV0czsKKwlib29sIHJlZ2lzdGVyZWREUU1CaW5wdXRzOworCWJvb2wgZGlmZmVyZW50aWFsQ2xvY2tJbnB1dDsKKwlib29sIHJlZHVuZGFudFJvd0FkZHJlc3Npbmc7CisKKwkvKiBtb2R1bGUgZ2VuZXJhbCBhdHRyaWJ1dGVzICovCisJYm9vbCBzdXBvcnRlZEF1dG9QcmVDaGFyZ2U7CisJYm9vbCBzdXBvcnRlZFByZUNoYXJnZUFsbDsKKwlib29sIHN1cG9ydGVkRWFybHlSYXNQcmVDaGFyZ2U7CisJYm9vbCBzdXBvcnRlZFdyaXRlMVJlYWRCdXJzdDsKKwlib29sIHN1cG9ydGVkNVBlcmNlbnRMb3dWQ0M7CisJYm9vbCBzdXBvcnRlZDVQZXJjZW50VXBwZXJWQ0M7CisJLyogbW9kdWxlIHRpbWluZyBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgaW50IG1pblJhc1RvQ2FzRGVsYXk7CisJdW5zaWduZWQgaW50IG1pblJvd0FjdGl2ZVJvd0FjdGl2ZURlbGF5OworCXVuc2lnbmVkIGludCBtaW5SYXNQdWxzZVdpZHRoOworCXVuc2lnbmVkIGludCBtaW5Sb3dQcmVjaGFyZ2VUaW1lOwkvKiBtZWFzdXJlZCBpbiBucyAqLworCisJaW50IGFkZHJBbmRDb21tYW5kSG9sZFRpbWU7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwlpbnQgYWRkckFuZENvbW1hbmRTZXR1cFRpbWU7CS8qIChtZWFzdXJlZCBpbiBucy8xMDApICovCisJaW50IGRhdGFJbnB1dFNldHVwVGltZTsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCWludCBkYXRhSW5wdXRIb2xkVGltZTsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworLyogdEFDIHRpbWVzIGZvciBoaWdoZXN0IDJuZCBhbmQgM3JkIGhpZ2hlc3QgQ0FTIExhdGVuY3kgdmFsdWVzICovCisJdW5zaWduZWQgaW50IGNsb2NrVG9EYXRhT3V0X0xvUDsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dF9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IGNsb2NrVG9EYXRhT3V0TWludXMxX0xvUDsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dE1pbnVzMV9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisJdW5zaWduZWQgaW50IGNsb2NrVG9EYXRhT3V0TWludXMyX0xvUDsJLyogTG9QIGxlZnQgb2YgcG9pbnQgKG1lYXN1cmVkIGluIG5zKSAqLworCXVuc2lnbmVkIGludCBjbG9ja1RvRGF0YU91dE1pbnVzMl9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisKKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisKKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMV9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMV9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisKKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMl9Mb1A7CS8qIExvUCBsZWZ0IG9mIHBvaW50IChtZWFzdXJlZCBpbiBucykgKi8KKwl1bnNpZ25lZCBpbnQgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMl9Sb1A7CS8qIFJvUCByaWdodCBvZiBwb2ludCAobWVhc3VyZWQgaW4gbnMpICovCisKKwkvKiBQYXJhbWV0ZXJzIGNhbGN1bGF0ZWQgZnJvbQorCSAgIHRoZSBleHRyYWN0ZWQgRElNTSBpbmZvcm1hdGlvbiAqLworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBkZXZpY2VEZW5zaXR5OwkvKiAxNiw2NCwxMjgsMjU2IG9yIDUxMiBNYml0ICovCisJdW5zaWduZWQgaW50IG51bWJlck9mRGV2aWNlczsKKwl1Y2hhciBkcmJfc2l6ZTsJCS8qIERSQU0gc2l6ZSBpbiBuKjY0TWJpdCAqLworCXVjaGFyIHNsb3Q7CQkvKiBTbG90IE51bWJlciB0aGlzIG1vZHVsZSBpcyBpbnNlcnRlZCBpbiAqLworCXVjaGFyIHNwZF9yYXdfZGF0YVsxMjhdOwkvKiBDb250ZW50IG9mIFNQRC1FRVBST00gY29waWVkIDE6MSAqLworI2lmZGVmIERFQlVHCisJdWNoYXIgbWFudWZhY3R1cmFbOF07CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDY0LTcxICovCisJdWNoYXIgbW9kdWxfaWRbMThdOwkvKiBDb250ZW50IG9mIFNQRC1FRVBST00gQnl0ZSA3My05MCAqLworCXVjaGFyIHZlbmRvcl9kYXRhWzI3XTsJLyogQ29udGVudCBvZiBTUEQtRUVQUk9NIEJ5dGUgOTktMTI1ICovCisJdW5zaWduZWQgbG9uZyBtb2R1bF9zZXJpYWxfbm87CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDk1LTk4ICovCisJdW5zaWduZWQgaW50IG1hbnVmYWNfZGF0ZTsJLyogQ29udGVudCBvZiBTUEQtRUVQUk9NIEJ5dGUgOTMtOTQgKi8KKwl1bnNpZ25lZCBpbnQgbW9kdWxfcmV2aXNpb247CS8qIENvbnRlbnQgb2YgU1BELUVFUFJPTSBCeXRlIDkxLTkyICovCisJdWNoYXIgbWFudWZhY19wbGFjZTsJLyogQ29udGVudCBvZiBTUEQtRUVQUk9NIEJ5dGUgNzIgKi8KKworI2VuZGlmCit9IEFVWF9NRU1fRElNTV9JTkZPOworCisKKy8qCisgKiB0cmFuc2xhdGUgbnMubnMvMTAgY29kaW5nIG9mIFNQRCB0aW1pbmcgdmFsdWVzCisgKiBpbnRvIDEwIHBzIHVuaXQgdmFsdWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgTlMxMHRvMTBQUyAodW5zaWduZWQgY2hhciBzcGRfYnl0ZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBucywgbnMxMDsKKworCS8qIGlzb2xhdGUgdXBwZXIgbmliYmxlICovCisJbnMgPSAoc3BkX2J5dGUgPj4gNCkgJiAweDBGOworCS8qIGlzb2xhdGUgbG93ZXIgbmliYmxlICovCisJbnMxMCA9IChzcGRfYnl0ZSAmIDB4MEYpOworCisJcmV0dXJuIChucyAqIDEwMCArIG5zMTAgKiAxMCk7Cit9CisKKy8qCisgKiB0cmFuc2xhdGUgbnMgY29kaW5nIG9mIFNQRCB0aW1pbmcgdmFsdWVzCisgKiBpbnRvIDEwIHBzIHVuaXQgdmFsdWVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgTlN0bzEwUFMgKHVuc2lnbmVkIGNoYXIgc3BkX2J5dGUpCit7CisJcmV0dXJuIChzcGRfYnl0ZSAqIDEwMCk7Cit9CisKKy8qIFRoaXMgY29kZSByZWFkcyB0aGUgU1BEIGNoaXAgb24gdGhlIHNkcmFtIGFuZCBwb3B1bGF0ZXMKKyAqIHRoZSBhcnJheSB3aGljaCBpcyBwYXNzZWQgaW4gd2l0aCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KKy8qIHN0YXRpYyBpbnQgY2hlY2tfZGltbSh1Y2hhciBzbG90LCBBVVhfTUVNX0RJTU1fSU5GTyAqaW5mbykgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZGltbSAodWNoYXIgc2xvdCwgQVVYX01FTV9ESU1NX0lORk8gKiBkaW1tSW5mbykKK3sKKwlERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworCXVuc2lnbmVkIGxvbmcgc3BkX2NoZWNrc3VtOworCisjaWZkZWYgWlVNQV9OVEwKKwkvKiB6ZXJvIGFsbCB0aGUgdmFsdWVzICovCisJbWVtc2V0IChpbmZvLCAwLCBzaXplb2YgKCppbmZvKSk7CisKKy8qCisJaWYgKCFzbG90KSB7CisJICAgIGluZm8tPnNsb3QgPSAwOworCSAgICBpbmZvLT5iYW5rcyA9IDE7CisJICAgIGluZm8tPnJlZ2lzdGVyZWQgPSAwOworCQkgICAgaW5mby0+ZHJiX3NpemUgPSAxNjsqLyAvKiAxNiAtIDI1Nk1CaXQsIDMyIC0gNTEyTUJpdCAqLworLyoJICAgIGluZm8tPnRwYXIgPSAzOworCSAgICBpbmZvLT50cmFzX2Nsb2NrcyA9IDU7CisJICAgIGluZm8tPmJ1cnN0X2xlbiA9IDQ7CisqLworI2lmZGVmIENPTkZJR19NVjY0NDYwX0VDQworCS8qIGNoZWNrIGZvciBFQ0MvcGFyaXR5IFswID0gbm9uZSwgMSA9IHBhcml0eSwgMiA9IGVjY10gKi8KKwlkaW1tSW5mby0+ZXJyb3JDaGVja1R5cGUgPSAyOworLyoJICAgIGluZm8tPmVjYyA9IDI7Ki8KKyNlbmRpZgorfQorCityZXR1cm4gMDsKKworI2Vsc2UKKwl1Y2hhciBhZGRyID0gc2xvdCA9PSAwID8gRElNTTBfSTJDX0FERFIgOiBESU1NMV9JMkNfQUREUjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpLCBqLCBkZW5zaXR5ID0gMSwgZGV2aWNlc0ZvckVyckNoZWNrID0gMDsKKworI2lmZGVmIERFQlVHCisJdW5zaWduZWQgaW50IGs7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgcmlnaHRPZlBvaW50ID0gMCwgbGVmdE9mUG9pbnQgPSAwLCBtdWx0LCBkaXYsIHRpbWVfdG1wOworCWludCBzaWduID0gMSwgc2hpZnQsIG1hc2tMZWZ0T2ZQb2ludCwgbWFza1JpZ2h0T2ZQb2ludDsKKwl1Y2hhciBzdXBwX2NhbCwgY2FsX3ZhbDsKKwl1bG9uZyBtZW1jbGssIHRtZW1jbGs7CisJdWxvbmcgdG1wOworCXVjaGFyIHRycF9jbG9ja3MgPSAwLCB0cmNkX2Nsb2NrcywgdHJhc19jbG9ja3MsIHRycmRfY2xvY2tzOworCXVjaGFyIGRhdGFbMTI4XTsKKworCW1lbWNsayA9IGdkLT5idXNfY2xrOworCXRtZW1jbGsgPSAxMDAwMDAwMDAwIC8gKG1lbWNsayAvIDEwMCk7CS8qIGluIDEwIHBzIHVuaXRzICovCisKKwlEUCAocHV0cyAoImJlZm9yZSBpMmMgcmVhZFxuIikpOworCisJcmV0ID0gaTJjX3JlYWQgKGFkZHIsIDAsIDEsIGRhdGEsIDEyOCk7CisKKwlEUCAocHV0cyAoImFmdGVyIGkyYyByZWFkXG4iKSk7CisKKwkvKiB6ZXJvIGFsbCB0aGUgdmFsdWVzICovCisJbWVtc2V0IChkaW1tSW5mbywgMCwgc2l6ZW9mICgqZGltbUluZm8pKTsKKworCS8qIGNvcHkgdGhlIFNQRCBjb250ZW50IDE6MSBpbnRvIHRoZSBkaW1tSW5mbyBzdHJ1Y3R1cmUgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDEyNzsgaSsrKSB7CisJCWRpbW1JbmZvLT5zcGRfcmF3X2RhdGFbaV0gPSBkYXRhW2ldOworCX0KKworCWlmIChyZXQpIHsKKwkJRFAgKHByaW50ZiAoIk5vIERJTU0gaW4gc2xvdCAlZCBbZXJyID0gJXhdXG4iLCBzbG90LCByZXQpKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWRpbW1JbmZvLT5zbG90ID0gc2xvdDsJLyogc3RhcnQgdG8gZmlsbCB1cCBkaW1taW5mbyBmb3IgdGhpcyAic2xvdCIgKi8KKworI2lmZGVmIENGR19ESVNQTEFZX0RJTU1fU1BEX0NPTlRFTlQKKworCWZvciAoaSA9IDA7IGkgPD0gMTI3OyBpKyspIHsKKwkJcHJpbnRmICgiU1BELUVFUFJPTSBCeXRlICUzZCA9ICUzeCAoJTNkKVxuIiwgaSwgZGF0YVtpXSwKKwkJCWRhdGFbaV0pOworCX0KKworI2VuZGlmCisjaWZkZWYgREVCVUcKKy8qIGZpbmQgTWFudWZhY3R1cmEgb2YgRGltbSBNb2R1bGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChkaW1tSW5mby0+bWFudWZhY3R1cmEpOyBpKyspIHsKKwkJZGltbUluZm8tPm1hbnVmYWN0dXJhW2ldID0gZGF0YVs2NCArIGldOworCX0KKwlwcmludGYgKCJcblRoaXMgUkFNLU1vZHVsZSBpcyBwcm9kdWNlZCBieTogCQklc1xuIiwKKwkJZGltbUluZm8tPm1hbnVmYWN0dXJhKTsKKworLyogZmluZCBNYW51bC1JRCBvZiBEaW1tIE1vZHVsZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRpbW1JbmZvLT5tb2R1bF9pZCk7IGkrKykgeworCQlkaW1tSW5mby0+bW9kdWxfaWRbaV0gPSBkYXRhWzczICsgaV07CisJfQorCXByaW50ZiAoIlRoZSBNb2R1bGUtSUQgb2YgdGhpcyBSQU0tTW9kdWxlIGlzOiAJCSVzXG4iLAorCQlkaW1tSW5mby0+bW9kdWxfaWQpOworCisvKiBmaW5kIFZlbmRvci1EYXRhIG9mIERpbW0gTW9kdWxlICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGltbUluZm8tPnZlbmRvcl9kYXRhKTsgaSsrKSB7CisJCWRpbW1JbmZvLT52ZW5kb3JfZGF0YVtpXSA9IGRhdGFbOTkgKyBpXTsKKwl9CisJcHJpbnRmICgiVmVuZG9yIERhdGEgb2YgdGhpcyBSQU0tTW9kdWxlIGlzOiAJCSVzXG4iLAorCQlkaW1tSW5mby0+dmVuZG9yX2RhdGEpOworCisvKiBmaW5kIG1vZHVsX3NlcmlhbF9ubyBvZiBEaW1tIE1vZHVsZSAqLworCWRpbW1JbmZvLT5tb2R1bF9zZXJpYWxfbm8gPSAoKigodW5zaWduZWQgbG9uZyAqKSAoJmRhdGFbOTVdKSkpOworCXByaW50ZiAoIlNlcmlhbCBOby4gb2YgdGhpcyBSQU0tTW9kdWxlIGlzOiAJCSVsZCAoJWx4KVxuIiwKKwkJZGltbUluZm8tPm1vZHVsX3NlcmlhbF9ubywgZGltbUluZm8tPm1vZHVsX3NlcmlhbF9ubyk7CisKKy8qIGZpbmQgTWFudWZhYy1EYXRhIG9mIERpbW0gTW9kdWxlICovCisJZGltbUluZm8tPm1hbnVmYWNfZGF0ZSA9ICgqKCh1bnNpZ25lZCBpbnQgKikgKCZkYXRhWzkzXSkpKTsKKwlwcmludGYgKCJNYW51ZmFjdG9yaW5nIERhdGUgb2YgdGhpcyBSQU0tTW9kdWxlIGlzOiAJJWQuJWRcbiIsIGRhdGFbOTNdLCBkYXRhWzk0XSk7CS8qZGltbUluZm8tPm1hbnVmYWNfZGF0ZSAqLworCisvKiBmaW5kIG1vZHVsX3JldmlzaW9uIG9mIERpbW0gTW9kdWxlICovCisJZGltbUluZm8tPm1vZHVsX3JldmlzaW9uID0gKCooKHVuc2lnbmVkIGludCAqKSAoJmRhdGFbOTFdKSkpOworCXByaW50ZiAoIk1vZHVsZSBSZXZpc2lvbiBvZiB0aGlzIFJBTS1Nb2R1bGUgaXM6IAkJJWQuJWRcbiIsIGRhdGFbOTFdLCBkYXRhWzkyXSk7CS8qIGRpbW1JbmZvLT5tb2R1bF9yZXZpc2lvbiAqLworCisvKiBmaW5kIG1hbnVmYWNfcGxhY2Ugb2YgRGltbSBNb2R1bGUgKi8KKwlkaW1tSW5mby0+bWFudWZhY19wbGFjZSA9ICgqKCh1bnNpZ25lZCBjaGFyICopICgmZGF0YVs3Ml0pKSk7CisJcHJpbnRmICgibWFudWZhY19wbGFjZSBvZiB0aGlzIFJBTS1Nb2R1bGUgaXM6IAkJJWRcbiIsCisJCWRpbW1JbmZvLT5tYW51ZmFjX3BsYWNlKTsKKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIGNhbGN1bGF0ZSBTUEQgY2hlY2tzdW0gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlzcGRfY2hlY2tzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8PSA2MjsgaSsrKSB7CisJCXNwZF9jaGVja3N1bSArPSBkYXRhW2ldOworCX0KKworCWlmICgoc3BkX2NoZWNrc3VtICYgMHhmZikgIT0gZGF0YVs2M10pIHsKKwkJcHJpbnRmICgiIyMjIEVycm9yIGluIFNQRCBDaGVja3N1bSAhISEgSXNfdmFsdWU6ICUyeCBzaG91bGQgdmFsdWUgJTJ4XG4iLCAodW5zaWduZWQgaW50KSAoc3BkX2NoZWNrc3VtICYgMHhmZiksIGRhdGFbNjNdKTsKKwkJaGFuZyAoKTsKKwl9CisKKwllbHNlCisJCXByaW50ZiAoIlNQRCBDaGVja3N1bSBvayFcbiIpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmb3IgKGkgPSAyOyBpIDw9IDM1OyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMjoJLyogTWVtb3J5IHR5cGUgKEREUiAvIFNEUkFNKSAqLworCQkJZGltbUluZm8tPm1lbW9yeVR5cGUgPSAoZGF0YVtpXSA9PSAweDcpID8gRERSIDogU0RSQU07CisjaWZkZWYgREVCVUcKKwkJCWlmIChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSAwKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJEcmFtX3R5cGUgaW4gc2xvdCAlZCBpczogCQkJU0RSQU1cbiIsCisJCQkJICAgICBkaW1tSW5mby0+c2xvdCkpOworCQkJaWYgKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIkRyYW1fdHlwZSBpbiBzbG90ICVkIGlzOiAJCQlERFJBTVxuIiwKKwkJCQkgICAgIGRpbW1JbmZvLT5zbG90KSk7CisjZW5kaWYKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMzoJLyogTnVtYmVyIE9mIFJvdyBBZGRyZXNzZXMgKi8KKwkJCWRpbW1JbmZvLT5udW1PZlJvd0FkZHJlc3NlcyA9IGRhdGFbaV07CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNb2R1bGUgTnVtYmVyIG9mIHJvdyBhZGRyZXNzZXM6IAkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5udW1PZlJvd0FkZHJlc3NlcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSA0OgkvKiBOdW1iZXIgT2YgQ29sdW1uIEFkZHJlc3NlcyAqLworCQkJZGltbUluZm8tPm51bU9mQ29sQWRkcmVzc2VzID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1vZHVsZSBOdW1iZXIgb2YgY29sIGFkZHJlc3NlczogCQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPm51bU9mQ29sQWRkcmVzc2VzKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDU6CS8qIE51bWJlciBPZiBNb2R1bGUgQmFua3MgKi8KKwkJCWRpbW1JbmZvLT5udW1PZk1vZHVsZUJhbmtzID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk51bWJlciBvZiBCYW5rcyBvbiBNb2QuIDogCQkJCSVkXG4iLAorCQkJICAgICBkaW1tSW5mby0+bnVtT2ZNb2R1bGVCYW5rcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSA2OgkvKiBEYXRhIFdpZHRoICovCisJCQlkaW1tSW5mby0+ZGF0YVdpZHRoID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1vZHVsZSBEYXRhIFdpZHRoOiAJCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5kYXRhV2lkdGgpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgODoJLyogVm9sdGFnZSBJbnRlcmZhY2UgKi8KKwkJCXN3aXRjaCAoZGF0YVtpXSkgeworCQkJY2FzZSAweDA6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBUVExfNVZfVE9MRVJBTlQ7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1vZHVsZSBpcyAJCQkJCVRUTF81Vl9UT0xFUkFOVFxuIikpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDE6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBMVlRUTDsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTW9kdWxlIGlzIAkJCQkJTFZUVExcbiIpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyOgorCQkJCWRpbW1JbmZvLT52b2x0YWdlSW50ZXJmYWNlID0gSFNUTF8xXzVWOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNb2R1bGUgaXMgCQkJCQlUVExfNVZfVE9MRVJBTlRcbiIpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzOgorCQkJCWRpbW1JbmZvLT52b2x0YWdlSW50ZXJmYWNlID0gU1NUTF8zXzNWOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNb2R1bGUgaXMgCQkJCQlIU1RMXzFfNVZcbiIpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg0OgorCQkJCWRpbW1JbmZvLT52b2x0YWdlSW50ZXJmYWNlID0gU1NUTF8yXzVWOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNb2R1bGUgaXMgCQkJCQlTU1RMXzJfNVZcbiIpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGltbUluZm8tPnZvbHRhZ2VJbnRlcmZhY2UgPSBWT0xUQUdFX1VOS05PV047CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1vZHVsZSBpcyAJCQkJCVZPTFRBR0VfVU5LTk9XTlxuIikpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSA5OgkvKiBNaW5pbXVtIEN5Y2xlIFRpbWUgQXQgTWF4IENhc0xhdGFuY3kgKi8KKwkJCXNoaWZ0ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyA0IDogMjsKKwkJCW11bHQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDEwIDogMjU7CisJCQltYXNrTGVmdE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmMCA6IDB4ZmM7CisJCQltYXNrUmlnaHRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZiA6IDB4MDM7CisJCQlsZWZ0T2ZQb2ludCA9IChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdDsKKwkJCXJpZ2h0T2ZQb2ludCA9IChkYXRhW2ldICYgbWFza1JpZ2h0T2ZQb2ludCkgKiBtdWx0OworCQkJZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lfTG9QID0KKwkJCQlsZWZ0T2ZQb2ludDsKKwkJCWRpbW1JbmZvLT5taW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5X1JvUCA9CisJCQkJcmlnaHRPZlBvaW50OworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTWluaW11bSBDeWNsZSBUaW1lIEF0IE1heCBDYXNMYXRhbmN5OiAJCSVkLiVkIFtuc11cbiIsCisJCQkgICAgIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTA6CS8qIENsb2NrIFRvIERhdGEgT3V0ICovCisJCQlkaXYgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDEwMCA6IDEwOworCQkJdGltZV90bXAgPQorCQkJCSgoKGRhdGFbaV0gJiAweGYwKSA+PiA0KSAqIDEwKSArCisJCQkJKChkYXRhW2ldICYgMHgwZikpOworCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIGRpdjsKKwkJCXJpZ2h0T2ZQb2ludCA9IHRpbWVfdG1wICUgZGl2OworCQkJZGltbUluZm8tPmNsb2NrVG9EYXRhT3V0X0xvUCA9IGxlZnRPZlBvaW50OworCQkJZGltbUluZm8tPmNsb2NrVG9EYXRhT3V0X1JvUCA9IHJpZ2h0T2ZQb2ludDsKKwkJCURQIChwcmludGYgKCJDbG9jayBUbyBEYXRhIE91dDogCQkJCSVkLiUyZCBbbnNdXG4iLCBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CS8qZGltbUluZm8tPmNsb2NrVG9EYXRhT3V0ICovCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyojaWZkZWYgQ09ORklHX0VDQyAqLworCQljYXNlIDExOgkvKiBFcnJvciBDaGVjayBUeXBlICovCisJCQlkaW1tSW5mby0+ZXJyb3JDaGVja1R5cGUgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiRXJyb3IgQ2hlY2sgVHlwZSAoMD1OT05FKTogCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5lcnJvckNoZWNrVHlwZSkpOworCQkJYnJlYWs7CisvKiAjZW5kaWYgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDEyOgkvKiBSZWZyZXNoIEludGVydmFsICovCisJCQlkaW1tSW5mby0+UmVmcmVzaEludGVydmFsID0gZGF0YVtpXTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIlJlZnJlc2hJbnRlcnZhbCAoODA9IFNlbGYgcmVmcmVzaCBOb3JtYWwsIDE1LjYyNXVzKSA6ICV4XG4iLAorCQkJICAgICBkaW1tSW5mby0+UmVmcmVzaEludGVydmFsKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDEzOgkvKiBTZHJhbSBXaWR0aCAqLworCQkJZGltbUluZm8tPnNkcmFtV2lkdGggPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiU2RyYW0gV2lkdGg6IAkJCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5zZHJhbVdpZHRoKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDE0OgkvKiBFcnJvciBDaGVjayBEYXRhIFdpZHRoICovCisJCQlkaW1tSW5mby0+ZXJyb3JDaGVja0RhdGFXaWR0aCA9IGRhdGFbaV07CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJFcnJvciBDaGVjayBEYXRhIFdpZHRoOiAJCQklZFxuIiwKKwkJCSAgICAgZGltbUluZm8tPmVycm9yQ2hlY2tEYXRhV2lkdGgpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTU6CS8qIE1pbmltdW0gQ2xvY2sgRGVsYXkgKi8KKwkJCWRpbW1JbmZvLT5taW5DbGtEZWxheSA9IGRhdGFbaV07CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNaW5pbXVtIENsb2NrIERlbGF5OiAJCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5taW5DbGtEZWxheSkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAxNjoJLyogQnVyc3QgTGVuZ3RoIFN1cHBvcnRlZCAqLworCQkJICAgLyoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSAgICogYml0MyB8IGJpdDIgfCBiaXQxIHwgYml0MCAqCisJCQkgICAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqKgorCSAgICBidXJzdCBsZW5ndGggPSAqICA4ICAgfCAgNCAgIHwgICAyICB8ICAgMSAgKgorCQkJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCSAgICBJZiBmb3IgZXhhbXBsZSBiaXQwIGFuZCBiaXQyIGFyZSBzZXQsIHRoZSBidXJzdAorCSAgICBsZW5ndGggc3VwcG9ydGVkIGFyZSAxIGFuZCA0LiAqLworCisJCQlkaW1tSW5mby0+YnVyc3RMZW5ndGhTdXBwb3J0ZWQgPSBkYXRhW2ldOworI2lmZGVmIERFQlVHCisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJCdXJzdCBMZW5ndGggU3VwcG9ydGVkOiAJCQkiKSk7CisJCQlpZiAoZGltbUluZm8tPmJ1cnN0TGVuZ3RoU3VwcG9ydGVkICYgMHgwMSkKKwkJCQlEUCAocHJpbnRmICgiMSwgIikpOworCQkJaWYgKGRpbW1JbmZvLT5idXJzdExlbmd0aFN1cHBvcnRlZCAmIDB4MDIpCisJCQkJRFAgKHByaW50ZiAoIjIsICIpKTsKKwkJCWlmIChkaW1tSW5mby0+YnVyc3RMZW5ndGhTdXBwb3J0ZWQgJiAweDA0KQorCQkJCURQIChwcmludGYgKCI0LCAiKSk7CisJCQlpZiAoZGltbUluZm8tPmJ1cnN0TGVuZ3RoU3VwcG9ydGVkICYgMHgwOCkKKwkJCQlEUCAocHJpbnRmICgiOCwgIikpOworCQkJRFAgKHByaW50ZiAoIiBCaXQgXG4iKSk7CisjZW5kaWYKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMTc6CS8qIE51bWJlciBPZiBCYW5rcyBPbiBFYWNoIERldmljZSAqLworCQkJZGltbUluZm8tPm51bU9mQmFua3NPbkVhY2hEZXZpY2UgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTnVtYmVyIE9mIEJhbmtzIE9uIEVhY2ggQ2hpcDogCQkJJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5udW1PZkJhbmtzT25FYWNoRGV2aWNlKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDE4OgkvKiBTdXBvcnRlZCBDYXMgTGF0ZW5jaWVzICovCisKKwkJCS8qICAgICBERFI6CisJCQkgKioqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKioqCisJCQkgKiBiaXQ3IHwgYml0NiB8IGJpdDUgfCBiaXQ0IHwgYml0MyB8IGJpdDIgfCBiaXQxIHwgYml0MCAqCisJCQkgKioqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKioqCisJCQkgQ0FTID0gICAqIFRCRCAgfCBUQkQgIHwgMy41ICB8ICAgMyAgfCAyLjUgIHwgIDIgICB8IDEuNSAgfCAgIDEgICoKKwkJCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJCSBTRFJBTToKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSAqIGJpdDcgfCBiaXQ2IHwgYml0NSB8IGJpdDQgfCBiaXQzIHwgYml0MiB8IGJpdDEgfCBiaXQwICoKKwkJCSAqKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKi0qKioqKiotKioqKioqLSoqKioqKioKKwkJCSBDQVMgPSAgICogVEJEICB8ICA3ICAgfCAgNiAgIHwgIDUgICB8ICA0ICAgfCAgMyAgIHwgICAyICB8ICAgMSAgKgorCQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkJZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzID0gZGF0YVtpXTsKKyNpZmRlZiBERUJVRworCQkJRFAgKHByaW50ZgorCQkJICAgICgiU3Vwb3J0ZWQgQ2FzIExhdGVuY2llczogKENMKSAJCQkiKSk7CisJCQlpZiAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gMCkgewkvKiBTRFJBTSAqLworCQkJCWZvciAoayA9IDA7IGsgPD0gNzsgaysrKSB7CisJCQkJCWlmIChkaW1tSW5mby0+CisJCQkJCSAgICBzdXBvcnRlZENhc0xhdGVuY2llcyAmICgxIDw8IGspKQorCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJICAgICgiJWQsIAkJCSIsCisJCQkJCQkgICAgIGsgKyAxKSk7CisJCQkJfQorCisJCQl9IGVsc2UgewkvKiBERFItUkFNICovCisKKwkJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgMSkKKwkJCQkJRFAgKHByaW50ZiAoIjEsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQ2FzTGF0ZW5jaWVzICYgMikKKwkJCQkJRFAgKHByaW50ZiAoIjEuNSwgIikpOworCQkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRDYXNMYXRlbmNpZXMgJiA0KQorCQkJCQlEUCAocHJpbnRmICgiMiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRDYXNMYXRlbmNpZXMgJiA4KQorCQkJCQlEUCAocHJpbnRmICgiMi41LCAiKSk7CisJCQkJaWYgKGRpbW1JbmZvLT5zdXBvcnRlZENhc0xhdGVuY2llcyAmIDE2KQorCQkJCQlEUCAocHJpbnRmICgiMywgIikpOworCQkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWRDYXNMYXRlbmNpZXMgJiAzMikKKwkJCQkJRFAgKHByaW50ZiAoIjMuNSwgIikpOworCisJCQl9CisJCQlEUCAocHJpbnRmICgiXG4iKSk7CisjZW5kaWYKKwkJCS8qIENhbGN1bGF0aW5nIE1BWCBDQVMgbGF0ZW5jeSAqLworCQkJZm9yIChqID0gNzsgaiA+IDA7IGotLSkgeworCQkJCWlmICgoKGRpbW1JbmZvLT4KKwkJCQkgICAgICBzdXBvcnRlZENhc0xhdGVuY2llcyA+PiBqKSAmIDB4MSkgPT0KKwkJCQkgICAgMSkgeworCQkJCQlzd2l0Y2ggKGRpbW1JbmZvLT5tZW1vcnlUeXBlKSB7CisJCQkJCWNhc2UgRERSOgorCQkJCQkJLyogQ0FTIGxhdGVuY3kgMSwgMS41LCAyLCAyLjUsIDMsIDMuNSAqLworCQkJCQkJc3dpdGNoIChqKSB7CisJCQkJCQljYXNlIDc6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKTogCQkJRVJST1IgISEhXG4iKSk7CisJCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCQltYXhDbFN1cHBvcnRlZF9ERFIKKwkJCQkJCQkJPQorCQkJCQkJCQlERFJfQ0xfRkFVTFQ7CisJCQkJCQkJaGFuZyAoKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNjoKKwkJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIpOiAJCQlFUlJPUiAhISFcbiIpKTsKKwkJCQkJCQlkaW1tSW5mby0+CisJCQkJCQkJCW1heENsU3VwcG9ydGVkX0REUgorCQkJCQkJCQk9CisJCQkJCQkJCUREUl9DTF9GQVVMVDsKKwkJCQkJCQloYW5nICgpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSA1OgorCQkJCQkJCURQIChwcmludGYKKwkJCQkJCQkgICAgKCJNYXguIENhcyBMYXRlbmNpZXMgKEREUik6IAkJCTMuNSBjbGsnc1xuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0gRERSX0NMXzNfNTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgNDoKKwkJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIpOiAJCQkzIGNsaydzIFxuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0gRERSX0NMXzM7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDM6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKTogCQkJMi41IGNsaydzIFxuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0gRERSX0NMXzJfNTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMjoKKwkJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIpOiAJCQkyIGNsaydzIFxuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0gRERSX0NMXzI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDE6CisJCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoRERSKTogCQkJMS41IGNsaydzIFxuIikpOworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0gRERSX0NMXzFfNTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJLyogcm9uZW4gLSBpbiBjYXNlIHdlIGhhdmUgYSBESU1NIHdpdGggbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeQorCQkJCQkJICAgbG93ZXIgdGhlbiBvdXIgU0RSQU0gY3ljbGUgY291bnQsIHdlIHdvbid0IGJlIGFibGUgdG8gc3VwcG9ydCB0aGlzIENBTAorCQkJCQkJICAgYW5kIHdlIHdpbGwgaGF2ZSB0byB1c2UgbG93ZXIgQ0FMLiAobWludXMgLSBtZWFucyBmcm9tIDMuMCB0byAyLjUpICovCisJCQkJCQlpZiAoKGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1AKKwkJCQkJCSAgICAgPAorCQkJCQkJICAgICBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX0xPUCkKKwkJCQkJCSAgICB8fAorCQkJCQkJICAgICgoZGltbUluZm8tPgorCQkJCQkJICAgICAgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Mb1AKKwkJCQkJCSAgICAgID09CisJCQkJCQkgICAgICBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX0xPUCkKKwkJCQkJCSAgICAgJiYgKGRpbW1JbmZvLT4KKwkJCQkJCQkgbWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeV9Sb1AKKwkJCQkJCQkgPAorCQkJCQkJCSBDRkdfRERSX1NEUkFNX0NZQ0xFX0NPVU5UX1JPUCkpKQorCQkJCQkJeworCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q2xTdXBwb3J0ZWRfRERSCisJCQkJCQkJCT0KKwkJCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCQltYXhDbFN1cHBvcnRlZF9ERFIKKwkJCQkJCQkJPj4gMTsKKwkJCQkJCQlEUCAocHJpbnRmCisJCQkJCQkJICAgICgiKioqIENoYW5nZSBhY3R1YWwgQ2FzIExhdGVuY2llcyBjYXVzZSBvZiBtaW5pbXVtQ3ljbGVUaW1lIG4iKSk7CisJCQkJCQl9CisJCQkJCQkvKiByb25lbiAtIGNoZWNraWYgdGhlIERpbW0gZnJlcXVlbmN5IGNvbXBhcmVkIHRvIHRoZSBTeXNjbG9jay4gKi8KKwkJCQkJCWlmICgoZGltbUluZm8tPgorCQkJCQkJICAgICBtaW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5X0xvUAorCQkJCQkJICAgICA+CisJCQkJCQkgICAgIENGR19ERFJfU0RSQU1fQ1lDTEVfQ09VTlRfTE9QKQorCQkJCQkJICAgIHx8CisJCQkJCQkgICAgKChkaW1tSW5mby0+CisJCQkJCQkgICAgICBtaW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5X0xvUAorCQkJCQkJICAgICAgPT0KKwkJCQkJCSAgICAgIENGR19ERFJfU0RSQU1fQ1lDTEVfQ09VTlRfTE9QKQorCQkJCQkJICAgICAmJiAoZGltbUluZm8tPgorCQkJCQkJCSBtaW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5X1JvUAorCQkJCQkJCSA+CisJCQkJCQkJIENGR19ERFJfU0RSQU1fQ1lDTEVfQ09VTlRfUk9QKSkpCisJCQkJCQl7CisJCQkJCQkJcHJpbnRmICgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwkJCQkJCQlwcmludGYgKCIqKiogc3lzQ2xvY2sgaXMgaGlnaGVyIHRoYW4gU0RSQU0ncyBhbGxvd2VkIGZyZXF1ZW5jeSAqKipcbiIpOworCQkJCQkJCXByaW50ZiAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJCQkJCQkJaGFuZyAoKTsKKwkJCQkJCX0KKworCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCW1heENBU2xhdGVuY3lTdXBwb3J0ZWRfTG9QCisJCQkJCQkJPQorCQkJCQkJCTEgKworCQkJCQkJCShpbnQpICg1ICogaiAvIDEwKTsKKwkJCQkJCWlmICgoKDUgKiBqKSAlIDEwKSAhPSAwKQorCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Sb1AKKwkJCQkJCQkJPSA1OworCQkJCQkJZWxzZQorCQkJCQkJCWRpbW1JbmZvLT4KKwkJCQkJCQkJbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Sb1AKKwkJCQkJCQkJPSAwOworCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIgTG9QLlJvUCBOb3RhdGlvbik6IAklZC4lZCBcbiIsCisJCQkJCQkgICAgIGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Mb1AsCisJCQkJCQkgICAgIGRpbW1JbmZvLT4KKwkJCQkJCSAgICAgbWF4Q0FTbGF0ZW5jeVN1cHBvcnRlZF9Sb1ApKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFNEUkFNOgorCQkJCQkJLyogQ0FTIGxhdGVuY3kgMSwgMiwgMywgNCwgNSwgNiwgNyAqLworCQkJCQkJZGltbUluZm8tPm1heENsU3VwcG9ydGVkX1NEID0gajsJLyogIENhcyBMYXRlbmN5IEREUi1SQU0gQ29kZWQgICAgICAgICAgICAgICAgICAgKi8KKwkJCQkJCURQIChwcmludGYKKwkJCQkJCSAgICAoIk1heC4gQ2FzIExhdGVuY2llcyAoU0QpOiAlZFxuIiwKKwkJCQkJCSAgICAgZGltbUluZm8tPgorCQkJCQkJICAgICBtYXhDbFN1cHBvcnRlZF9TRCkpOworCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCW1heENBU2xhdGVuY3lTdXBwb3J0ZWRfTG9QCisJCQkJCQkJPSBqOworCQkJCQkJZGltbUluZm8tPgorCQkJCQkJCW1heENBU2xhdGVuY3lTdXBwb3J0ZWRfUm9QCisJCQkJCQkJPSAwOworCQkJCQkJRFAgKHByaW50ZgorCQkJCQkJICAgICgiTWF4LiBDYXMgTGF0ZW5jaWVzIChERFIgTG9QLlJvUCBOb3RhdGlvbik6ICVkLiVkIFxuIiwKKwkJCQkJCSAgICAgZGltbUluZm8tPgorCQkJCQkJICAgICBtYXhDQVNsYXRlbmN5U3VwcG9ydGVkX0xvUCwKKwkJCQkJCSAgICAgZGltbUluZm8tPgorCQkJCQkJICAgICBtYXhDQVNsYXRlbmN5U3VwcG9ydGVkX1JvUCkpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyMToJLyogQnVmZmVyZWQgQWRkcmVzcyBBbmQgQ29udHJvbCBJbnB1dHMgKi8KKwkJCURQIChwcmludGYgKCJcbk1vZHVsIEF0dHJpYnV0ZXMgKFNQRCBCeXRlIDIxKTogXG4iKSk7CisJCQlkaW1tSW5mby0+YnVmZmVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9CisJCQkJZGF0YVtpXSAmIEJJVDA7CisJCQlkaW1tSW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID0KKwkJCQkoZGF0YVtpXSAmIEJJVDEpID4+IDE7CisJCQlkaW1tSW5mby0+b25DYXJkUExMID0gKGRhdGFbaV0gJiBCSVQyKSA+PiAyOworCQkJZGltbUluZm8tPmJ1ZmZlcmVkRFFNQmlucHV0cyA9IChkYXRhW2ldICYgQklUMykgPj4gMzsKKwkJCWRpbW1JbmZvLT5yZWdpc3RlcmVkRFFNQmlucHV0cyA9CisJCQkJKGRhdGFbaV0gJiBCSVQ0KSA+PiA0OworCQkJZGltbUluZm8tPmRpZmZlcmVudGlhbENsb2NrSW5wdXQgPQorCQkJCShkYXRhW2ldICYgQklUNSkgPj4gNTsKKwkJCWRpbW1JbmZvLT5yZWR1bmRhbnRSb3dBZGRyZXNzaW5nID0KKwkJCQkoZGF0YVtpXSAmIEJJVDYpID4+IDY7CisjaWZkZWYgREVCVUcKKwkJCWlmIChkaW1tSW5mby0+YnVmZmVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBCdWZmZXJlZCBBZGRyZXNzL0NvbnRyb2wgSW5wdXQ6CQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIEJ1ZmZlcmVkIEFkZHJlc3MvQ29udHJvbCBJbnB1dDoJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBSZWdpc3RlcmVkIEFkZHJlc3MvQ29udHJvbCBJbnB1dDoJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gUmVnaXN0ZXJlZCBBZGRyZXNzL0NvbnRyb2wgSW5wdXQ6CQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5vbkNhcmRQTEwgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gT24tQ2FyZCBQTEwgKGNsb2NrKToJCQkJWWVzIFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBPbi1DYXJkIFBMTCAoY2xvY2spOgkJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5idWZmZXJlZERRTUJpbnB1dHMgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gQnVmZmVyZCBEUU1CIElucHV0czoJCQkJWWVzIFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBCdWZmZXJkIERRTUIgSW5wdXRzOgkJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5yZWdpc3RlcmVkRFFNQmlucHV0cyA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBSZWdpc3RlcmVkIERRTUIgSW5wdXRzOgkJCVllcyBcbiIpKTsKKwkJCWVsc2UKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gUmVnaXN0ZXJlZCBEUU1CIElucHV0czoJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5kaWZmZXJlbnRpYWxDbG9ja0lucHV0ID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIERpZmZlcmVudGlhbCBDbG9jayBJbnB1dDoJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIERpZmZlcmVudGlhbCBDbG9jayBJbnB1dDoJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5yZWR1bmRhbnRSb3dBZGRyZXNzaW5nID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIHJlZHVuZGFudCBSb3cgQWRkcmVzc2luZzoJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIHJlZHVuZGFudCBSb3cgQWRkcmVzc2luZzoJCQlObyBcbiIpKTsKKworI2VuZGlmCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDIyOgkvKiBTdXBvcnRlZCBBdXRvUHJlQ2hhcmdlICovCisJCQlEUCAocHJpbnRmICgiXG5Nb2R1bCBBdHRyaWJ1dGVzIChTUEQgQnl0ZSAyMik6IFxuIikpOworCQkJZGltbUluZm8tPnN1cG9ydGVkRWFybHlSYXNQcmVDaGFyZ2UgPSBkYXRhW2ldICYgQklUMDsKKwkJCWRpbW1JbmZvLT5zdXBvcnRlZEF1dG9QcmVDaGFyZ2UgPQorCQkJCShkYXRhW2ldICYgQklUMSkgPj4gMTsKKwkJCWRpbW1JbmZvLT5zdXBvcnRlZFByZUNoYXJnZUFsbCA9CisJCQkJKGRhdGFbaV0gJiBCSVQyKSA+PiAyOworCQkJZGltbUluZm8tPnN1cG9ydGVkV3JpdGUxUmVhZEJ1cnN0ID0KKwkJCQkoZGF0YVtpXSAmIEJJVDMpID4+IDM7CisJCQlkaW1tSW5mby0+c3Vwb3J0ZWQ1UGVyY2VudExvd1ZDQyA9CisJCQkJKGRhdGFbaV0gJiBCSVQ0KSA+PiA0OworCQkJZGltbUluZm8tPnN1cG9ydGVkNVBlcmNlbnRVcHBlclZDQyA9CisJCQkJKGRhdGFbaV0gJiBCSVQ1KSA+PiA1OworI2lmZGVmIERFQlVHCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkRWFybHlSYXNQcmVDaGFyZ2UgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gRWFybHkgUmFzIFByZWNoYXJnZToJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtICBFYXJseSBSYXMgUHJlY2hhcmdlOgkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkQXV0b1ByZUNoYXJnZSA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBBdXRvUHJlQ2hhcmdlOgkJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtICBBdXRvUHJlQ2hhcmdlOgkJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5zdXBvcnRlZFByZUNoYXJnZUFsbCA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBQcmVjaGFyZ2UgQWxsOgkJCQlZZXMgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtICBQcmVjaGFyZ2UgQWxsOgkJCQlObyBcbiIpKTsKKworCQkJaWYgKGRpbW1JbmZvLT5zdXBvcnRlZFdyaXRlMVJlYWRCdXJzdCA9PSAxKQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSBXcml0ZSAxL1JlYWRCdXJzdDoJCQkJWWVzIFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSAgV3JpdGUgMS9SZWFkQnVyc3Q6CQkJCU5vIFxuIikpOworCisJCQlpZiAoZGltbUluZm8tPnN1cG9ydGVkNVBlcmNlbnRMb3dWQ0MgPT0gMSkKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiIC0gbG93ZXIgVkNDIHRvbGVyYW5jZToJCQk1IFBlcmNlbnQgXG4iKSk7CisJCQllbHNlCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAgLSBsb3dlciBWQ0MgdG9sZXJhbmNlOgkJCTEwIFBlcmNlbnQgXG4iKSk7CisKKwkJCWlmIChkaW1tSW5mby0+c3Vwb3J0ZWQ1UGVyY2VudFVwcGVyVkNDID09IDEpCisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIiAtIHVwcGVyIFZDQyB0b2xlcmFuY2U6CQkJNSBQZXJjZW50IFxuIikpOworCQkJZWxzZQorCQkJCURQIChwcmludGYKKwkJCQkgICAgKCIgLSAgdXBwZXIgVkNDIHRvbGVyYW5jZToJCQkxMCBQZXJjZW50IFxuIikpOworCisjZW5kaWYKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMjM6CS8qIE1pbmltdW0gQ3ljbGUgVGltZSBBdCBNYXhpbXVtIENhcyBMYXRhbmN5IE1pbnVzIDEgKDJuZCBoaWdoZXN0IENMKSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDQgOiAyOworCQkJbXVsdCA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMTAgOiAyNTsKKwkJCW1hc2tMZWZ0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweGYwIDogMHhmYzsKKwkJCW1hc2tSaWdodE9mUG9pbnQgPQorCQkJCShkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gMHhmIDogMHgwMzsKKwkJCWxlZnRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrTGVmdE9mUG9pbnQpID4+IHNoaWZ0OworCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiBtYXNrUmlnaHRPZlBvaW50KSAqIG11bHQ7CisJCQlkaW1tSW5mby0+bWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMV9Mb1AgPQorCQkJCWxlZnRPZlBvaW50OworCQkJZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3lNaW51czFfUm9QID0KKwkJCQlyaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmICgiTWluaW11bSBDeWNsZSBUaW1lIEF0IDJuZCBoaWdoZXN0IENhc0xhdGFuY3kgKDAgPSBOb3Qgc3VwcG9ydGVkKTogJWQuJWQgW25zXVxuIiwgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOwkvKmRpbW1JbmZvLT5taW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5ICovCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDI0OgkvKiBDbG9jayBUbyBEYXRhIE91dCAybmQgaGlnaGVzdCBDYXMgTGF0ZW5jeSBWYWx1ZSAqLworCQkJZGl2ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAxMDAgOiAxMDsKKwkJCXRpbWVfdG1wID0KKwkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCSgoZGF0YVtpXSAmIDB4MGYpKTsKKwkJCWxlZnRPZlBvaW50ID0gdGltZV90bXAgLyBkaXY7CisJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIGRpdjsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dE1pbnVzMV9Mb1AgPSBsZWZ0T2ZQb2ludDsKKwkJCWRpbW1JbmZvLT5jbG9ja1RvRGF0YU91dE1pbnVzMV9Sb1AgPSByaWdodE9mUG9pbnQ7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJDbG9jayBUbyBEYXRhIE91dCAoMm5kIENMIHZhbHVlKTogCQklZC4lMmQgW25zXVxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyNToJLyogTWluaW11bSBDeWNsZSBUaW1lIEF0IE1heGltdW0gQ2FzIExhdGFuY3kgTWludXMgMiAoM3JkIGhpZ2hlc3QgQ0wpICovCisJCQlzaGlmdCA9IChkaW1tSW5mby0+bWVtb3J5VHlwZSA9PSBERFIpID8gNCA6IDI7CisJCQltdWx0ID0gKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAxMCA6IDI1OworCQkJbWFza0xlZnRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZjAgOiAweGZjOworCQkJbWFza1JpZ2h0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweGYgOiAweDAzOworCQkJbGVmdE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tMZWZ0T2ZQb2ludCkgPj4gc2hpZnQ7CisJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tSaWdodE9mUG9pbnQpICogbXVsdDsKKwkJCWRpbW1JbmZvLT5taW5pbXVtQ3ljbGVUaW1lQXRNYXhDYXNMYXRhbmN5TWludXMyX0xvUCA9CisJCQkJbGVmdE9mUG9pbnQ7CisJCQlkaW1tSW5mby0+bWluaW11bUN5Y2xlVGltZUF0TWF4Q2FzTGF0YW5jeU1pbnVzMl9Sb1AgPQorCQkJCXJpZ2h0T2ZQb2ludDsKKwkJCURQIChwcmludGYgKCJNaW5pbXVtIEN5Y2xlIFRpbWUgQXQgM3JkIGhpZ2hlc3QgQ2FzTGF0YW5jeSAoMCA9IE5vdCBzdXBwb3J0ZWQpOiAlZC4lZCBbbnNdXG4iLCBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CS8qZGltbUluZm8tPm1pbmltdW1DeWNsZVRpbWVBdE1heENhc0xhdGFuY3kgKi8KKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMjY6CS8qIENsb2NrIFRvIERhdGEgT3V0IDNyZCBoaWdoZXN0IENhcyBMYXRlbmN5IFZhbHVlICovCisJCQlkaXYgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDEwMCA6IDEwOworCQkJdGltZV90bXAgPQorCQkJCSgoKGRhdGFbaV0gJiAweGYwKSA+PiA0KSAqIDEwKSArCisJCQkJKChkYXRhW2ldICYgMHgwZikpOworCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIGRpdjsKKwkJCXJpZ2h0T2ZQb2ludCA9IHRpbWVfdG1wICUgZGl2OworCQkJZGltbUluZm8tPmNsb2NrVG9EYXRhT3V0TWludXMyX0xvUCA9IGxlZnRPZlBvaW50OworCQkJZGltbUluZm8tPmNsb2NrVG9EYXRhT3V0TWludXMyX1JvUCA9IHJpZ2h0T2ZQb2ludDsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkNsb2NrIFRvIERhdGEgT3V0ICgzcmQgQ0wgdmFsdWUpOiAJCSVkLiUyZCBbbnNdXG4iLAorCQkJICAgICBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDI3OgkvKiBNaW5pbXVtIFJvdyBQcmVjaGFyZ2UgVGltZSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDIgOiAwOworCQkJbWFza0xlZnRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZmMgOiAweGZmOworCQkJbWFza1JpZ2h0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweDAzIDogMHgwMDsKKwkJCWxlZnRPZlBvaW50ID0gKChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdCk7CisJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tSaWdodE9mUG9pbnQpICogMjU7CisKKwkJCWRpbW1JbmZvLT5taW5Sb3dQcmVjaGFyZ2VUaW1lID0gKChsZWZ0T2ZQb2ludCAqIDEwMCkgKyByaWdodE9mUG9pbnQpOwkvKiBtZWFzdXJlZCBpbiBuIHRpbWVzIDEwcHMgSW50ZXJ2YWxzICovCisJCQl0cnBfY2xvY2tzID0KKwkJCQkoZGltbUluZm8tPm1pblJvd1ByZWNoYXJnZVRpbWUgKworCQkJCSAodG1lbWNsayAtIDEpKSAvIHRtZW1jbGs7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCIqKiogMSBjbG9jayBjeWNsZSA9ICVsZCAgMTBwcyBpbnRlcnZhbGxzID0gJWxkLiVsZCBucyoqKipcbiIsCisJCQkgICAgIHRtZW1jbGssIHRtZW1jbGsgLyAxMDAsIHRtZW1jbGsgJSAxMDApKTsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1pbmltdW0gUm93IFByZWNoYXJnZSBUaW1lIFtuc106IAkJJWQuJTJkID0gaW4gQ2xrIGN5Y2xlcyAlZFxuIiwKKwkJCSAgICAgbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCwgdHJwX2Nsb2NrcykpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAyODoJLyogTWluaW11bSBSb3cgQWN0aXZlIHRvIFJvdyBBY3RpdmUgVGltZSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDIgOiAwOworCQkJbWFza0xlZnRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZmMgOiAweGZmOworCQkJbWFza1JpZ2h0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweDAzIDogMHgwMDsKKwkJCWxlZnRPZlBvaW50ID0gKChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdCk7CisJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tSaWdodE9mUG9pbnQpICogMjU7CisKKwkJCWRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSA9ICgobGVmdE9mUG9pbnQgKiAxMDApICsgcmlnaHRPZlBvaW50KTsJLyogbWVhc3VyZWQgaW4gMTAwbnMgSW50ZXJ2YWxzICovCisJCQl0cnJkX2Nsb2NrcyA9CisJCQkJKGRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSArCisJCQkJICh0bWVtY2xrIC0gMSkpIC8gdG1lbWNsazsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1pbmltdW0gUm93IEFjdGl2ZSAtVG8tIFJvdyBBY3RpdmUgRGVsYXkgW25zXTogCSVkLiUyZCA9IGluIENsayBjeWNsZXMgJWRcbiIsCisJCQkgICAgIGxlZnRPZlBvaW50LCByaWdodE9mUG9pbnQsIHRycF9jbG9ja3MpKTsKKwkJCWJyZWFrOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJCWNhc2UgMjk6CS8qIE1pbmltdW0gUmFzLVRvLUNhcyBEZWxheSAqLworCQkJc2hpZnQgPSAoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDIgOiAwOworCQkJbWFza0xlZnRPZlBvaW50ID0KKwkJCQkoZGltbUluZm8tPm1lbW9yeVR5cGUgPT0gRERSKSA/IDB4ZmMgOiAweGZmOworCQkJbWFza1JpZ2h0T2ZQb2ludCA9CisJCQkJKGRpbW1JbmZvLT5tZW1vcnlUeXBlID09IEREUikgPyAweDAzIDogMHgwMDsKKwkJCWxlZnRPZlBvaW50ID0gKChkYXRhW2ldICYgbWFza0xlZnRPZlBvaW50KSA+PiBzaGlmdCk7CisJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIG1hc2tSaWdodE9mUG9pbnQpICogMjU7CisKKwkJCWRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSA9ICgobGVmdE9mUG9pbnQgKiAxMDApICsgcmlnaHRPZlBvaW50KTsJLyogbWVhc3VyZWQgaW4gMTAwbnMgSW50ZXJ2YWxzICovCisJCQl0cmNkX2Nsb2NrcyA9CisJCQkJKGRpbW1JbmZvLT5taW5Sb3dBY3RpdmVSb3dBY3RpdmVEZWxheSArCisJCQkJICh0bWVtY2xrIC0gMSkpIC8gdG1lbWNsazsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIk1pbmltdW0gUmFzLVRvLUNhcyBEZWxheSBbbnNdOiAJCQklZC4lMmQgPSBpbiBDbGsgY3ljbGVzICVkXG4iLAorCQkJICAgICBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50LCB0cnBfY2xvY2tzKSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDMwOgkvKiBNaW5pbXVtIFJhcyBQdWxzZSBXaWR0aCAqLworCQkJZGltbUluZm8tPm1pblJhc1B1bHNlV2lkdGggPSBkYXRhW2ldOworCQkJdHJhc19jbG9ja3MgPQorCQkJCShOU3RvMTBQUyAoZGF0YVtpXSkgKworCQkJCSAodG1lbWNsayAtIDEpKSAvIHRtZW1jbGs7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJNaW5pbXVtIFJhcyBQdWxzZSBXaWR0aCBbbnNdOiAJCQklZCA9IGluIENsayBjeWNsZXMgJWRcbiIsCisJCQkgICAgIGRpbW1JbmZvLT5taW5SYXNQdWxzZVdpZHRoLCB0cmFzX2Nsb2NrcykpOworCisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDMxOgkvKiBNb2R1bGUgQmFuayBEZW5zaXR5ICovCisJCQlkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgPSBkYXRhW2ldOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiTW9kdWxlIEJhbmsgRGVuc2l0eTogCQkJCSVkXG4iLAorCQkJICAgICBkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkpKTsKKyNpZmRlZiBERUJVRworCQkJRFAgKHByaW50ZgorCQkJICAgICgiKioqIE9mZmVyZWQgRGVuc2l0aWVzIChtb3JlIHRoYW4gMSA9IE11bHRpc2l6ZS1Nb2R1bGUpOiAiKSk7CisJCQl7CisJCQkJaWYgKGRpbW1JbmZvLT5tb2R1bGVCYW5rRGVuc2l0eSAmIDEpCisJCQkJCURQIChwcmludGYgKCI0TUIsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPm1vZHVsZUJhbmtEZW5zaXR5ICYgMikKKwkJCQkJRFAgKHByaW50ZiAoIjhNQiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiA0KQorCQkJCQlEUCAocHJpbnRmICgiMTZNQiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiA4KQorCQkJCQlEUCAocHJpbnRmICgiMzJNQiwgIikpOworCQkJCWlmIChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiAxNikKKwkJCQkJRFAgKHByaW50ZiAoIjY0TUIsICIpKTsKKwkJCQlpZiAoZGltbUluZm8tPm1vZHVsZUJhbmtEZW5zaXR5ICYgMzIpCisJCQkJCURQIChwcmludGYgKCIxMjhNQiwgIikpOworCQkJCWlmICgoZGltbUluZm8tPm1vZHVsZUJhbmtEZW5zaXR5ICYgNjQpCisJCQkJICAgIHx8IChkaW1tSW5mby0+bW9kdWxlQmFua0RlbnNpdHkgJiAxMjgpKSB7CisJCQkJCURQIChwcmludGYgKCJFUlJPUiwgIikpOworCQkJCQloYW5nICgpOworCQkJCX0KKwkJCX0KKwkJCURQIChwcmludGYgKCJcbiIpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAzMjoJLyogQWRkcmVzcyBBbmQgQ29tbWFuZCBTZXR1cCBUaW1lIChtZWFzdXJlZCBpbiBucy8xMDAwKSAqLworCQkJc2lnbiA9IDE7CisJCQlzd2l0Y2ggKGRpbW1JbmZvLT5tZW1vcnlUeXBlKSB7CisJCQljYXNlIEREUjoKKwkJCQl0aW1lX3RtcCA9CisJCQkJCSgoKGRhdGFbaV0gJiAweGYwKSA+PiA0KSAqIDEwKSArCisJCQkJCSgoZGF0YVtpXSAmIDB4MGYpKTsKKwkJCQlsZWZ0T2ZQb2ludCA9IHRpbWVfdG1wIC8gMTAwOworCQkJCXJpZ2h0T2ZQb2ludCA9IHRpbWVfdG1wICUgMTAwOworCQkJCWJyZWFrOworCQkJY2FzZSBTRFJBTToKKwkJCQlsZWZ0T2ZQb2ludCA9IChkYXRhW2ldICYgMHhmMCkgPj4gNDsKKwkJCQlpZiAobGVmdE9mUG9pbnQgPiA3KSB7CisJCQkJCWxlZnRPZlBvaW50ID0gZGF0YVtpXSAmIDB4NzAgPj4gNDsKKwkJCQkJc2lnbiA9IC0xOworCQkJCX0KKwkJCQlyaWdodE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4MGYpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGltbUluZm8tPmFkZHJBbmRDb21tYW5kU2V0dXBUaW1lID0KKwkJCQkobGVmdE9mUG9pbnQgKiAxMDAgKyByaWdodE9mUG9pbnQpICogc2lnbjsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkFkZHJlc3MgQW5kIENvbW1hbmQgU2V0dXAgVGltZSBbbnNdOiAJCSVkLiVkXG4iLAorCQkJICAgICBzaWduICogbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAzMzoJLyogQWRkcmVzcyBBbmQgQ29tbWFuZCBIb2xkIFRpbWUgKi8KKwkJCXNpZ24gPSAxOworCQkJc3dpdGNoIChkaW1tSW5mby0+bWVtb3J5VHlwZSkgeworCQkJY2FzZSBERFI6CisJCQkJdGltZV90bXAgPQorCQkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCQkoKGRhdGFbaV0gJiAweDBmKSk7CisJCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIDEwMDsKKwkJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RSQU06CisJCQkJbGVmdE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4ZjApID4+IDQ7CisJCQkJaWYgKGxlZnRPZlBvaW50ID4gNykgeworCQkJCQlsZWZ0T2ZQb2ludCA9IGRhdGFbaV0gJiAweDcwID4+IDQ7CisJCQkJCXNpZ24gPSAtMTsKKwkJCQl9CisJCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiAweDBmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRpbW1JbmZvLT5hZGRyQW5kQ29tbWFuZEhvbGRUaW1lID0KKwkJCQkobGVmdE9mUG9pbnQgKiAxMDAgKyByaWdodE9mUG9pbnQpICogc2lnbjsKKwkJCURQIChwcmludGYKKwkJCSAgICAoIkFkZHJlc3MgQW5kIENvbW1hbmQgSG9sZCBUaW1lIFtuc106IAkJJWQuJWRcbiIsCisJCQkgICAgIHNpZ24gKiBsZWZ0T2ZQb2ludCwgcmlnaHRPZlBvaW50KSk7CisJCQlicmVhazsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCQljYXNlIDM0OgkvKiBEYXRhIElucHV0IFNldHVwIFRpbWUgKi8KKwkJCXNpZ24gPSAxOworCQkJc3dpdGNoIChkaW1tSW5mby0+bWVtb3J5VHlwZSkgeworCQkJY2FzZSBERFI6CisJCQkJdGltZV90bXAgPQorCQkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCQkoKGRhdGFbaV0gJiAweDBmKSk7CisJCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIDEwMDsKKwkJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RSQU06CisJCQkJbGVmdE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4ZjApID4+IDQ7CisJCQkJaWYgKGxlZnRPZlBvaW50ID4gNykgeworCQkJCQlsZWZ0T2ZQb2ludCA9IGRhdGFbaV0gJiAweDcwID4+IDQ7CisJCQkJCXNpZ24gPSAtMTsKKwkJCQl9CisJCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiAweDBmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRpbW1JbmZvLT5kYXRhSW5wdXRTZXR1cFRpbWUgPQorCQkJCShsZWZ0T2ZQb2ludCAqIDEwMCArIHJpZ2h0T2ZQb2ludCkgKiBzaWduOworCQkJRFAgKHByaW50ZgorCQkJICAgICgiRGF0YSBJbnB1dCBTZXR1cCBUaW1lIFtuc106IAkJCSVkLiVkXG4iLAorCQkJICAgICBzaWduICogbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwkJY2FzZSAzNToJLyogRGF0YSBJbnB1dCBIb2xkIFRpbWUgKi8KKwkJCXNpZ24gPSAxOworCQkJc3dpdGNoIChkaW1tSW5mby0+bWVtb3J5VHlwZSkgeworCQkJY2FzZSBERFI6CisJCQkJdGltZV90bXAgPQorCQkJCQkoKChkYXRhW2ldICYgMHhmMCkgPj4gNCkgKiAxMCkgKworCQkJCQkoKGRhdGFbaV0gJiAweDBmKSk7CisJCQkJbGVmdE9mUG9pbnQgPSB0aW1lX3RtcCAvIDEwMDsKKwkJCQlyaWdodE9mUG9pbnQgPSB0aW1lX3RtcCAlIDEwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0RSQU06CisJCQkJbGVmdE9mUG9pbnQgPSAoZGF0YVtpXSAmIDB4ZjApID4+IDQ7CisJCQkJaWYgKGxlZnRPZlBvaW50ID4gNykgeworCQkJCQlsZWZ0T2ZQb2ludCA9IGRhdGFbaV0gJiAweDcwID4+IDQ7CisJCQkJCXNpZ24gPSAtMTsKKwkJCQl9CisJCQkJcmlnaHRPZlBvaW50ID0gKGRhdGFbaV0gJiAweDBmKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRpbW1JbmZvLT5kYXRhSW5wdXRIb2xkVGltZSA9CisJCQkJKGxlZnRPZlBvaW50ICogMTAwICsgcmlnaHRPZlBvaW50KSAqIHNpZ247CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJEYXRhIElucHV0IEhvbGQgVGltZSBbbnNdOiAJCQklZC4lZFxuXG4iLAorCQkJICAgICBzaWduICogbGVmdE9mUG9pbnQsIHJpZ2h0T2ZQb2ludCkpOworCQkJYnJlYWs7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCX0KKwl9CisJLyogY2FsY3VsYXRpbmcgdGhlIHNkcmFtIGRlbnNpdHkgKi8KKwlmb3IgKGkgPSAwOworCSAgICAgaSA8IGRpbW1JbmZvLT5udW1PZlJvd0FkZHJlc3NlcyArIGRpbW1JbmZvLT5udW1PZkNvbEFkZHJlc3NlczsKKwkgICAgIGkrKykgeworCQlkZW5zaXR5ID0gZGVuc2l0eSAqIDI7CisJfQorCWRpbW1JbmZvLT5kZXZpY2VEZW5zaXR5ID0gZGVuc2l0eSAqIGRpbW1JbmZvLT5udW1PZkJhbmtzT25FYWNoRGV2aWNlICoKKwkJZGltbUluZm8tPnNkcmFtV2lkdGg7CisJZGltbUluZm8tPm51bWJlck9mRGV2aWNlcyA9CisJCShkaW1tSW5mby0+ZGF0YVdpZHRoIC8gZGltbUluZm8tPnNkcmFtV2lkdGgpICoKKwkJZGltbUluZm8tPm51bU9mTW9kdWxlQmFua3M7CisJZGV2aWNlc0ZvckVyckNoZWNrID0KKwkJKGRpbW1JbmZvLT5kYXRhV2lkdGggLSA2NCkgLyBkaW1tSW5mby0+c2RyYW1XaWR0aDsKKwlpZiAoKGRpbW1JbmZvLT5lcnJvckNoZWNrVHlwZSA9PSAweDEpCisJICAgIHx8IChkaW1tSW5mby0+ZXJyb3JDaGVja1R5cGUgPT0gMHgyKQorCSAgICB8fCAoZGltbUluZm8tPmVycm9yQ2hlY2tUeXBlID09IDB4MykpIHsKKwkJZGltbUluZm8tPnNpemUgPQorCQkJKGRpbW1JbmZvLT5kZXZpY2VEZW5zaXR5IC8gOCkgKgorCQkJKGRpbW1JbmZvLT5udW1iZXJPZkRldmljZXMgLQorCQkJIC8qIHJvbmVuIG9uIHRoZSAxRyBkaW1tIHdlIGdldCB3cm9uZyB2YWx1ZS4gKHdhcyBkZXZpY2VzRm9yRXJyQ2hlY2spICovCisJCQkgZGltbUluZm8tPm51bWJlck9mRGV2aWNlcyAvIDgpOworCX0gZWxzZSB7CisJCWRpbW1JbmZvLT5zaXplID0KKwkJCShkaW1tSW5mby0+ZGV2aWNlRGVuc2l0eSAvIDgpICoKKwkJCWRpbW1JbmZvLT5udW1iZXJPZkRldmljZXM7CisJfQorCisJLyogY29tcHV0ZSB0aGUgbW9kdWxlIERSQiBzaXplICovCisJdG1wID0gKDEgPDwKKwkgICAgICAgKGRpbW1JbmZvLT5udW1PZlJvd0FkZHJlc3NlcyArIGRpbW1JbmZvLT5udW1PZkNvbEFkZHJlc3NlcykpOworCXRtcCAqPSBkaW1tSW5mby0+bnVtT2ZNb2R1bGVCYW5rczsKKwl0bXAgKj0gZGltbUluZm8tPnNkcmFtV2lkdGg7CisJdG1wID0gdG1wID4+IDI0OwkvKiBkaXYgYnkgMHg0MDAwMDAwICg2NE0pICAgICAgICovCisJZGltbUluZm8tPmRyYl9zaXplID0gKHVjaGFyKSB0bXA7CisJRFAgKHByaW50ZiAoIk1vZHVsZSBEUkIgc2l6ZSAobio2NE1iaXQpOiAlZFxuIiwgZGltbUluZm8tPmRyYl9zaXplKSk7CisKKwkvKiB0cnkgYSBDQVMgbGF0ZW5jeSBvZiAzIGZpcnN0Li4uICovCisKKwkvKiBiaXQgMSBpcyBDTDIsIGJpdCAyIGlzIENMMyAqLworCXN1cHBfY2FsID0gKGRpbW1JbmZvLT5zdXBvcnRlZENhc0xhdGVuY2llcyAmIDB4NikgPj4gMTsKKworCWNhbF92YWwgPSAwOworCWlmIChzdXBwX2NhbCAmIDMpIHsKKwkJaWYgKE5TMTB0bzEwUFMgKGRhdGFbOV0pIDw9IHRtZW1jbGspCisJCQljYWxfdmFsID0gMzsKKwl9CisKKwkvKiB0aGVuIDIuLi4gKi8KKwlpZiAoc3VwcF9jYWwgJiAyKSB7CisJCWlmIChOUzEwdG8xMFBTIChkYXRhWzIzXSkgPD0gdG1lbWNsaykKKwkJCWNhbF92YWwgPSAyOworCX0KKworCURQIChwcmludGYgKCJjYWxfdmFsID0gJWRcbiIsIGNhbF92YWwpKTsKKworCS8qIGJ1bW1lciwgZGlkJ3Qgd29yay4uLiAqLworCWlmIChjYWxfdmFsID09IDApIHsKKwkJRFAgKHByaW50ZiAoIkNvdWxkbid0IGZpbmQgYSBnb29kIENBUyBsYXRlbmN5XG4iKSk7CisJCWhhbmcgKCk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiB0cnVlOworI2VuZGlmCit9CisKKy8qIHNldHMgdXAgdGhlIEdUIHByb3Blcmx5IHdpdGggaW5mb3JtYXRpb24gcGFzc2VkIGluICovCitpbnQgc2V0dXBfc2RyYW0gKEFVWF9NRU1fRElNTV9JTkZPICogaW5mbykKK3sKKwl1bG9uZyB0bXAsIGNoZWNrOworCXVsb25nIHRtcF9zZHJhbV9tb2RlID0gMDsJLyogMHgxNDFjICovCisJdWxvbmcgdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMDsJLyogMHgxNDA0ICovCisJaW50IGk7CisKKwkvKiBhZGRlZCA4LzIxLzIwMDMgUC4gTWFyY2hlc2UgKi8KKwl1bnNpZ25lZCBpbnQgc2RyYW1fY29uZmlnX3JlZzsKKworCS8qIGFkZGVkIDEwLzEwLzIwMDMgUC4gTWFyY2hlc2UgKi8KKwl1bG9uZyBzZHJhbV9jaGlwX3NpemU7CisKKwkvKiBzYW5pdHkgY2hlY2tpbmcgKi8KKwlpZiAoIWluZm8tPm51bU9mTW9kdWxlQmFua3MpIHsKKwkJcHJpbnRmICgic2V0dXBfc2RyYW0gY2FsbGVkIHdpdGggMCBiYW5rc1xuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIGRlbGF5IGxpbmUgKi8KKwlzZXRfZGZjZGxJbml0ICgpOwkvKiBtYXkgYmUgaXRzIG5vdCBuZWVkZWQgKi8KKwlEUCAocHJpbnRmICgiRGVsYXkgbGluZSBzZXQgZG9uZVxuIikpOworCisJLyogc2V0IFNEUkFNIG1vZGUgTk9QICovIC8qIFRvX2RvIGNoZWNrIGl0ICovCisJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVSQVRJT04sIDB4NSk7CisJd2hpbGUgKEdUUkVHUkVBRCAoU0RSQU1fT1BFUkFUSU9OKSAhPSAwKSB7CisJCURQIChwcmludGYKKwkJICAgICgiXG4qKiogU0RSQU1fT1BFUkFUSU9OIDE0MTg6IE1vZHVsZSBzdGlsbCBidXN5IC4uLiBwbGVhc2Ugd2FpdC4uLiAqKipcbiIpKTsKKwl9CisKKwkvKiBTRFJBTSBjb25maWd1cmF0aW9uICovCisvKiBhZGRlZCA4LzIxLzIwMDMgUC4gTWFyY2hlc2UgKi8KKy8qIGNvZGUgYWxsb3dzIHVzYWdlIG9mIHJlZ2lzdGVyZWQgRElNTVMgKi8KKworCS8qIGZpZ3VyZSBvdXQgdGhlIG1lbW9yeSByZWZyZXNoIGludGVybmFsICovCisJc3dpdGNoIChpbmZvLT5SZWZyZXNoSW50ZXJ2YWwpIHsKKwljYXNlIDB4MDoKKwljYXNlIDB4ODA6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAxNS42MjUgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSAxNS42MjUgKiAoZmxvYXQpIENGR19CVVNfSFopCisJCQkJCS8gKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MToKKwljYXNlIDB4ODE6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAzLjkgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSAzLjkgKiAoZmxvYXQpIENGR19CVVNfSFopIC8KKwkJCQkJKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MjoKKwljYXNlIDB4ODI6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyA3LjggdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSA3LjggKiAoZmxvYXQpIENGR19CVVNfSFopIC8KKwkJCQkJKGZsb2F0KSAxMDAwMDAwLjApOworCQlicmVhazsKKwljYXNlIDB4MzoKKwljYXNlIDB4ODM6CQkvKiByZWZyZXNoIHBlcmlvZCBpcyAzMS4zIHVzZWMgKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9CisJCQkodW5zaWduZWQgaW50KSAoKChmbG9hdCkgMzEuMyAqIChmbG9hdCkgQ0ZHX0JVU19IWikgLworCQkJCQkoZmxvYXQpIDEwMDAwMDAuMCk7CisJCWJyZWFrOworCWNhc2UgMHg0OgorCWNhc2UgMHg4NDoJCS8qIHJlZnJlc2ggcGVyaW9kIGlzIDYyLjUgdXNlYyAqLworCQlzZHJhbV9jb25maWdfcmVnID0KKwkJCSh1bnNpZ25lZCBpbnQpICgoKGZsb2F0KSA2Mi41ICogKGZsb2F0KSBDRkdfQlVTX0haKSAvCisJCQkJCShmbG9hdCkgMTAwMDAwMC4wKTsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJY2FzZSAweDg1OgkJLyogcmVmcmVzaCBwZXJpb2QgaXMgMTI1IHVzZWMgKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9CisJCQkodW5zaWduZWQgaW50KSAoKChmbG9hdCkgMTI1ICogKGZsb2F0KSBDRkdfQlVTX0haKSAvCisJCQkJCShmbG9hdCkgMTAwMDAwMC4wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIHJlZnJlc2ggcGVyaW9kIHVuZGVmaW5lZCAqLworCQlwcmludGYgKCJEUkFNIHJlZnJlc2ggcGVyaW9kIGlzIHVua25vd24hXG4iKTsKKwkJcHJpbnRmICgiQWJvcnRpbmcgRFJBTSBzZXR1cCB3aXRoIGFuIGVycm9yXG4iKTsKKwkJaGFuZyAoKTsKKwkJYnJlYWs7CisJfQorCURQIChwcmludGYgKCJjYWxjdWxhdGVkIHJlZnJlc2ggaW50ZXJ2YWwgJTB4XG4iLCBzZHJhbV9jb25maWdfcmVnKSk7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHJlZnJlc2ggdmFsdWUgaXMgb25seSAxNCBiaXRzICovCisJaWYgKHNkcmFtX2NvbmZpZ19yZWcgPiAweDFmZmYpCisJCXNkcmFtX2NvbmZpZ19yZWcgPSAweDFmZmY7CisJRFAgKHByaW50ZiAoImFkanVzdGVkIHJlZnJlc2ggaW50ZXJ2YWwgJTB4XG4iLCBzZHJhbV9jb25maWdfcmVnKSk7CisKKwkvKiB3ZSB3YW50IHBoeXNpY2FsIGJhbmsgaW50ZXJsZWF2aW5nIGFuZCAqLworCS8qIHZpcnR1YWwgYmFuayBpbnRlcmxlYXZpbmcgZW5hYmxlZCBzbyBkbyBub3RoaW5nICovCisJLyogc2luY2UgdGhlc2UgYml0cyBuZWVkIHRvIGJlIHplcm8gdG8gZW5hYmxlIHRoZSBpbnRlcmxlYXZpbmcgKi8KKworCS8qICByZWdpc3RlcmVkIERSQU0gPyAqLworCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkgeworCQkvKiBpdCdzIHJlZ2lzdGVyZWQgRFJBTSwgc28gc2V0IHRoZSByZWcuIERSQU0gYml0ICovCisJCXNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnIHwgQklUMTc7CisJCURQIChwcmludGYgKCJFbmFibGluZyByZWdpc3RlcmVkIERSQU0gYml0XG4iKSk7CisJfQorCS8qIHR1cm4gb24gRFJBTSBFQ0M/ICovCisjaWZkZWYgQ09ORklHX01WNjQ0NjBfRUNDCisJaWYgKGluZm8tPmVycm9yQ2hlY2tUeXBlID09IDB4MikgeworCQkvKiBEUkFNIGhhcyBFQ0MsIHNvIHR1cm4gaXQgb24gKi8KKwkJc2RyYW1fY29uZmlnX3JlZyA9IHNkcmFtX2NvbmZpZ19yZWcgfCBCSVQxODsKKwkJRFAgKHByaW50ZiAoIkVuYWJsaW5nIEVDQ1xuIikpOworCX0KKyNlbmRpZgorCS8qIHNldCB0aGUgZGF0YSBEUVMgcGluIGNvbmZpZ3VyYXRpb24gKi8KKwlzd2l0Y2ggKGluZm8tPnNkcmFtV2lkdGgpIHsKKwljYXNlIDB4NDoJCS8qIG1lbW9yeSBpcyB4NCAqLworCQlzZHJhbV9jb25maWdfcmVnID0gc2RyYW1fY29uZmlnX3JlZyB8IEJJVDIwIHwgQklUMjE7CisJCURQIChwcmludGYgKCJEYXRhIERRUyBwaW5zIHNldCBmb3IgMTYgcGluc1xuIikpOworCQlicmVhazsKKwljYXNlIDB4ODoJCS8qIG1lbW9yeSBpcyB4OCBvciB4MTYgKi8KKwljYXNlIDB4MTA6CisJCXNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnIHwgQklUMjE7CisJCURQIChwcmludGYgKCJEYXRhIERRUyBwaW5zIHNldCBmb3IgOCBwaW5zXG4iKSk7CisJCWJyZWFrOworCWNhc2UgMHgyMDoJCS8qIG1lbW9yeSBpcyB4MzIgKi8KKwkJLyogYm90aCBiaXRzIGFyZSBjbGVhcmVkIGZvciB4MzIgc28gbm90aGluZyB0byBkbyAqLworCQlEUCAocHJpbnRmICgiRGF0YSBEUVMgcGlucyBzZXQgZm9yIDIgcGluc1xuIikpOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogbWVtb3J5IHdpZHRoIHVuc3VwcG9ydGVkICovCisJCXByaW50ZiAoIkRSQU0gY2hpcCB3aWR0aCBpcyB1bmtub3duIVxuIik7CisJCXByaW50ZiAoIkFib3J0aW5nIERSQU0gc2V0dXAgd2l0aCBhbiBlcnJvclxuIik7CisJCWhhbmcgKCk7CisJCWJyZWFrOworCX0KKworCS8qcm9uZW4gZGI2NDQ2MCAqLworCS8qIHBlcmZvcm0gcmVhZCBidWZmZXIgYXNzaWdubWVudHMgKi8KKwkvKiB3ZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBQb3dlci11cCBkZWZhdWx0cyAqLworCS8qIGJpdCAyNyA9IFBDSSBidXMgIzAgPSBidWZmZXIgMCAqLworCS8qIGJpdCAyOCA9IFBDSSBidXMgIzEgPSBidWZmZXIgMCAqLworCS8qIGJpdCAyOSA9IE1QU0MgPSBidWZmZXIgMCAqLworCS8qIGJpdCAzMCA9IElETUEgPSBidWZmZXIgMCAqLworCS8qIGJpdCAzMSA9IEdpZ2FiaXQgPSBidWZmZXIgMCAqLworCXNkcmFtX2NvbmZpZ19yZWcgPSBzZHJhbV9jb25maWdfcmVnIHwgMHg1ODAwMDAwMDsKKwlzZHJhbV9jb25maWdfcmVnID0gc2RyYW1fY29uZmlnX3JlZyAmIDB4ZmZmZmZmMDA7CisJLyogYml0IDE0IEZCU3BsaXQgPSBGQ1JBTSBjb250cm9sbGVyIGJzcGxpdCBlbmFibGUuICovCisJLyogYml0IDE1IHZ3ID0gRkNSQU0gVmFyaWFibGUgd3JpdGUgbGVuZ3RoIGVuYWJsZS4gICAqLworCS8qIGJpdCAxNiBEVHlwZSA9IERyYW0gVHlwZSAoMCA9IEZDUkFNLDEgPSBTdGFuZGFyZCkgKi8KKwlzZHJhbV9jb25maWdfcmVnID0gc2RyYW1fY29uZmlnX3JlZyB8IEJJVDE0IHwgQklUMTU7CisKKwkvKiB3cml0ZSB0aGUgdmFsdWUgaW50byB0aGUgU0RSQU0gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCUdUX1JFR19XUklURSAoU0RSQU1fQ09ORklHLCBzZHJhbV9jb25maWdfcmVnKTsKKwlEUCAocHJpbnRmICgic2RyYW1fY29uZiAweDE0MDA6ICUwOHhcbiIsIEdUUkVHUkVBRCAoU0RSQU1fQ09ORklHKSkpOworCisJLyogU0RSQU0gb3BlbiBwYWdlcyBjb250cm9sIGtlZXAgb3BlbiBhcyBtdWNoIGFzIEkgY2FuICovCisJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVOX1BBR0VTX0NPTlRST0wsIDB4MCk7CisJRFAgKHByaW50ZgorCSAgICAoInNkcmFtX29wZW5fcGFnZXNfY29udHJvbGwgMHgxNDE0OiAlMDh4XG4iLAorCSAgICAgR1RSRUdSRUFEIChTRFJBTV9PUEVOX1BBR0VTX0NPTlRST0wpKSk7CisKKwkvKiBTRFJBTSBEX1VOSVRfQ09OVFJPTF9MT1cgMHgxNDA0ICovCisJdG1wID0gKEdUUkVHUkVBRCAoRF9VTklUX0NPTlRST0xfTE9XKSAmIDB4MDEpOwkvKiBDbG9jayBEb21haW4gU3luYyBmcm9tIHBvd2VyIG9uIHJlc2V0ICovCisJaWYgKHRtcCA9PSAwKQorCQlEUCAocHJpbnRmICgiQ29yZSBTaWduYWxzIGFyZSBzeW5jIChieSBIVy1TZXR0aW5nKSEhIVxuIikpOworCWVsc2UKKwkJRFAgKHByaW50ZgorCQkgICAgKCJDb3JlIFNpZ25hbHMgc3luY3MuIGFyZSBieXBhc3NlZCAoYnkgSFctU2V0dGluZykhISFcbiIpKTsKKworCS8qIFNEUkFNIHNldCBDQVMgTGF0ZW5jeSBhY2NvcmRpbmcgdG8gU1BEIGluZm9ybWF0aW9uICovCisJc3dpdGNoIChpbmZvLT5tZW1vcnlUeXBlKSB7CisJY2FzZSBTRFJBTToKKwkJcHJpbnRmICgiIyMjIFNELVJBTSBub3Qgc3VwcG9ydGVkICEhIVxuIik7CisJCXByaW50ZiAoIkFib3J0aW5nISEhXG4iKTsKKwkJaGFuZyAoKTsKKwkJLyogVG9EbyBmaWxsIFNELVJBTSBpZiBuZWVkZWQgISEhISEgKi8KKwkJYnJlYWs7CisJCS8qIENhbGN1bGF0ZSB0aGUgc2V0dGluZ3MgZm9yIFNEUkFNIG1vZGUgYW5kIER1bml0IGNvbnRyb2wgbG93IHJlZ2lzdGVycyAqLworCQkvKiBWYWx1ZXMgc2V0IGFjY29yZGluZyB0byB0ZWNobmljYWwgYnVsbGV0aW4gVEItOTIgcmV2LiBjICovCisJY2FzZSBERFI6CisJCURQIChwcmludGYgKCIjIyMgU0VULUNMIGZvciBERFItUkFNXG4iKSk7CisJCS8qIHJvbmVuIGRiNjQ0NjAgLSBjaGFuZ2UgdGhlIHRtcF9kdW5pdF9jb250cm9sX2xvdyBzZXR0aW5nISEhICovCisJCXN3aXRjaCAoaW5mby0+bWF4Q2xTdXBwb3J0ZWRfRERSKSB7CisJCWNhc2UgRERSX0NMXzM6CisJCQl0bXBfc2RyYW1fbW9kZSA9IDB4MzI7CS8qIENMPTMgQnVyc3RsZW5ndGggPSA0ICovCisJCQlpZiAodG1wID09IDEpIHsJLyogY2xvY2tzIHN5bmMgKi8KKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCS8qIHJlZ2lzdGVyZCBERFIgU0RSQU0/ICovCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MDUxMTAwNTE7CisJCQkJZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDI0MTEwMDUxOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNYXguIENMIGlzIDMgQ0xLcyAweDE0MWM9ICUwOGx4LCAweDE0MDQgPSAlMDhseFxuIiwKKwkJCQkgICAgIHRtcF9zZHJhbV9tb2RlLCB0bXBfZHVuaXRfY29udHJvbF9sb3cpKTsKKwkJCQlwcmludGYgKCJXYXJubmluZzogRFJBTSBDbGtTeW5jIHdhcyBuZXZlciB0ZXN0ZWQoZGI2NDQ2MCkhISEhIVxuIik7CisJCQl9IGVsc2UgewkvKiBjbGsgc3luYy4gYnlwYXNzZWQgICAqLworCisJCQkJaWYgKGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cyA9PSAxKQkvKiByZWdpc3RlcmQgRERSIFNEUkFNPyAqLworCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweEM1MDAwNTQwOworCQkJCWVsc2UKKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHhDNDAwMDU0MDsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTWF4LiBDTCBpcyAzIENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBERFJfQ0xfMl81OgorCQkJdG1wX3NkcmFtX21vZGUgPSAweDYyOwkvKiBDTD0yLjUgQnVyc3RsZW5ndGggPSA0ICovCisJCQlpZiAodG1wID09IDEpIHsJLyogY2xvY2tzIHN5bmMgKi8KKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCS8qIHJlZ2lzdGVyZCBERFIgU0RSQU0/ICovCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MjUxMTAwNTE7CisJCQkJZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDI0MTEwMDUxOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNYXguIENMIGlzIDIuNSBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJCXByaW50ZiAoIldhcm5uaW5nOiBEUkFNIENsa1N5bmMgd2FzIG5ldmVyIHRlc3RlZChkYjY0NDYwKSEhISEhXG4iKTsKKwkJCX0gZWxzZSB7CS8qIGNsayBzeW5jLiBieXBhc3NlZCAgICovCisKKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpIHsJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHhDNTAwMDU0MDsKKwkJCQkJLyogcHJpbnRmKCJDTCA9IDIuNSwgQ2xvY2sgVW5zeW5jJ2VkLCBEdW5pdCBDb250cm9sIExvdyByZWdpc3RlciBzZXR0aW5nIHVuZGVmaW5lZFxuIik7MSAqLworCQkJCQkvKiBwcmludGYoIkFib3J0aW5nISEhXG4iKTsxICovCisJCQkJCS8qIGhhbmcoKTsxICovCisJCQkJfSBlbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4QzQwMDA1NDA7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMi41IENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBERFJfQ0xfMjoKKwkJCXRtcF9zZHJhbV9tb2RlID0gMHgyMjsJLyogQ0w9MiBCdXJzdGxlbmd0aCA9IDQgKi8KKwkJCWlmICh0bXAgPT0gMSkgewkvKiBjbG9ja3Mgc3luYyAqLworCQkJCWlmIChpbmZvLT5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgPT0gMSkJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJdG1wX2R1bml0X2NvbnRyb2xfbG93ID0gMHgwNDExMDA1MTsKKwkJCQllbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MDMxMTAwNTE7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMiBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJCXByaW50ZiAoIldhcm5uaW5nOiBEUkFNIENsa1N5bmMgd2FzIG5ldmVyIHRlc3RlZChkYjY0NDYwKSEhISEhXG4iKTsKKwkJCX0gZWxzZSB7CS8qIGNsayBzeW5jLiBieXBhc3NlZCAgICovCisKKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpIHsJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJLypwcmludGYoIkNMID0gMiwgQ2xvY2sgVW5zeW5jJ2VkLCBEdW5pdCBDb250cm9sIExvdyByZWdpc3RlciBzZXR0aW5nIHVuZGVmaW5lZFxuIik7MSAqLworCQkJCQkvKnByaW50ZigiQWJvcnRpbmchISFcbiIpOzEgKi8KKwkJCQkJLypoYW5nKCk7MSAqLworCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweEM0MDAwNTQwOworCQkJCX0gZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweEMzMDAwNTQwOzsKKwkJCQlEUCAocHJpbnRmCisJCQkJICAgICgiTWF4LiBDTCBpcyAyIENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBERFJfQ0xfMV81OgorCQkJdG1wX3NkcmFtX21vZGUgPSAweDUyOwkvKiBDTD0xLjUgQnVyc3RsZW5ndGggPSA0ICovCisJCQlpZiAodG1wID09IDEpIHsJLyogY2xvY2tzIHN5bmMgKi8KKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpCS8qIHJlZ2lzdGVyZCBERFIgU0RSQU0/ICovCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4MjQxMTAwNTE7CisJCQkJZWxzZQorCQkJCQl0bXBfZHVuaXRfY29udHJvbF9sb3cgPSAweDIzMTEwMDUxOworCQkJCURQIChwcmludGYKKwkJCQkgICAgKCJNYXguIENMIGlzIDEuNSBDTEtzIDB4MTQxYz0gJTA4bHgsIDB4MTQwNCA9ICUwOGx4XG4iLAorCQkJCSAgICAgdG1wX3NkcmFtX21vZGUsIHRtcF9kdW5pdF9jb250cm9sX2xvdykpOworCQkJCXByaW50ZiAoIldhcm5uaW5nOiBEUkFNIENsa1N5bmMgd2FzIG5ldmVyIHRlc3RlZChkYjY0NDYwKSEhISEhXG4iKTsKKwkJCX0gZWxzZSB7CS8qIGNsayBzeW5jLiBieXBhc3NlZCAgICovCisKKwkJCQlpZiAoaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzID09IDEpIHsJLyogcmVnaXN0ZXJkIEREUiBTRFJBTT8gKi8KKwkJCQkJLypwcmludGYoIkNMID0gMS41LCBDbG9jayBVbnN5bmMnZWQsIER1bml0IENvbnRyb2wgTG93IHJlZ2lzdGVyIHNldHRpbmcgdW5kZWZpbmVkXG4iKTsxICovCisJCQkJCS8qcHJpbnRmKCJBYm9ydGluZyEhIVxuIik7MSAqLworCQkJCQkvKmhhbmcoKTsxICovCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4QzQwMDA1NDA7CisJCQkJfSBlbHNlCisJCQkJCXRtcF9kdW5pdF9jb250cm9sX2xvdyA9IDB4QzMwMDA1NDA7CisJCQkJRFAgKHByaW50ZgorCQkJCSAgICAoIk1heC4gQ0wgaXMgMS41IENMS3MgMHgxNDFjPSAlMDhseCwgMHgxNDA0ID0gJTA4bHhcbiIsCisJCQkJICAgICB0bXBfc2RyYW1fbW9kZSwgdG1wX2R1bml0X2NvbnRyb2xfbG93KSk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmICgiTWF4LiBDTCBpcyBvdXQgb2YgcmFuZ2UgJWRcbiIsCisJCQkJaW5mby0+bWF4Q2xTdXBwb3J0ZWRfRERSKTsKKwkJCWhhbmcgKCk7CisJCQlicmVhazsKKwkJfQkJLyogZW5kIEREUiBzd2l0Y2ggKi8KKwkJYnJlYWs7CisJfQkJCS8qIGVuZCBDTCBzd2l0Y2ggKi8KKworCS8qIFdyaXRlIHJlc3VsdHMgb2YgQ0wgZGV0ZWN0aW9uIHByb2NlZHVyZSAqLworCS8qIHNldCBTRFJBTSBtb2RlIHJlZy4gMHgxNDFjICovCisJR1RfUkVHX1dSSVRFIChTRFJBTV9NT0RFLCB0bXBfc2RyYW1fbW9kZSk7CisKKwkvKiBzZXQgU0RSQU0gbW9kZSBTZXRDb21tYW5kIDB4MTQxOCAqLworCUdUX1JFR19XUklURSAoU0RSQU1fT1BFUkFUSU9OLCAweDMpOworCXdoaWxlIChHVFJFR1JFQUQgKFNEUkFNX09QRVJBVElPTikgIT0gMCkgeworCQlEUCAocHJpbnRmCisJCSAgICAoIlxuKioqIFNEUkFNX09QRVJBVElPTiAweDE0MTggYWZ0ZXIgU0RSQU1fTU9ERTogTW9kdWxlIHN0aWxsIGJ1c3kgLi4uIHBsZWFzZSB3YWl0Li4uICoqKlxuIikpOworCX0KKworCS8qIFNEUkFNIERfVU5JVF9DT05UUk9MX0xPVyAweDE0MDQgKi8KKwlHVF9SRUdfV1JJVEUgKERfVU5JVF9DT05UUk9MX0xPVywgdG1wX2R1bml0X2NvbnRyb2xfbG93KTsKKworCS8qIHNldCBTRFJBTSBtb2RlIFNldENvbW1hbmQgMHgxNDE4ICovCisJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVSQVRJT04sIDB4Myk7CisJd2hpbGUgKEdUUkVHUkVBRCAoU0RSQU1fT1BFUkFUSU9OKSAhPSAwKSB7CisJCURQIChwcmludGYKKwkJICAgICgiXG4qKiogU0RSQU1fT1BFUkFUSU9OIDE0MTggYWZ0ZXIgRF9VTklUX0NPTlRST0xfTE9XOiBNb2R1bGUgc3RpbGwgYnVzeSAuLi4gcGxlYXNlIHdhaXQuLi4gKioqXG4iKSk7CisJfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogYmFuayBwYXJhbWV0ZXJzICovCisJLyogU0RSQU0gYWRkcmVzcyBkZWNvZGUgcmVnaXN0ZXIgMHgxNDEwICovCisJLyogcHJvZ3JhbSB0aGlzIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwl0bXAgPSAweDAyOwkJLyogcG93ZXItdXAgZGVmYXVsdCBhZGRyZXNzIHNlbGVjdCBkZWNvZGluZyB2YWx1ZSAqLworCisJRFAgKHByaW50ZiAoImRyYl9zaXplIChuKjY0TWJpdCk6ICVkXG4iLCBpbmZvLT5kcmJfc2l6ZSkpOworLyogZmlndXJlIG91dCB0aGUgRFJBTSBjaGlwIHNpemUgKi8KKwlzZHJhbV9jaGlwX3NpemUgPQorCQkoMSA8PCAoaW5mby0+bnVtT2ZSb3dBZGRyZXNzZXMgKyBpbmZvLT5udW1PZkNvbEFkZHJlc3NlcykpOworCXNkcmFtX2NoaXBfc2l6ZSAqPSBpbmZvLT5zZHJhbVdpZHRoOworCXNkcmFtX2NoaXBfc2l6ZSAqPSA0OworCURQIChwcmludGYgKCJjb21wdXRlZCBzZHJhbSBjaGlwIHNpemUgaXMgJSNseFxuIiwgc2RyYW1fY2hpcF9zaXplKSk7CisJLyogZGl2aWRlIHNkcmFtIGNoaXAgc2l6ZSBieSA2NCBNYml0cyAqLworCXNkcmFtX2NoaXBfc2l6ZSA9IHNkcmFtX2NoaXBfc2l6ZSAvIDB4NDAwMDAwMDsKKwlzd2l0Y2ggKHNkcmFtX2NoaXBfc2l6ZSkgeworCWNhc2UgMToJCS8qIDY0IE1iaXQgKi8KKwljYXNlIDI6CQkvKiAxMjggTWJpdCAqLworCQlEUCAocHJpbnRmICgiUkFNLURldmljZV9zaXplIDY0TWJpdCBvciAxMjhNYml0KVxuIikpOworCQl0bXAgfD0gKDB4MDAgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNDoJCS8qIDI1NiBNYml0ICovCisJY2FzZSA4OgkJLyogNTEyIE1iaXQgKi8KKwkJRFAgKHByaW50ZiAoIlJBTS1EZXZpY2Vfc2l6ZSAyNTZNYml0IG9yIDUxMk1iaXQpXG4iKSk7CisJCXRtcCB8PSAoMHgwMSA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSAxNjoJCS8qIDEgR2JpdCAqLworCWNhc2UgMzI6CQkvKiAyIEdiaXQgKi8KKwkJRFAgKHByaW50ZiAoIlJBTS1EZXZpY2Vfc2l6ZSAxR2JpdCBvciAyR2JpdClcbiIpKTsKKwkJdG1wIHw9ICgweDAyIDw8IDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYgKCJFcnJvciBpbiBkcmFtIHNpemUgY2FsY3VsYXRpb25cbiIpOworCQlwcmludGYgKCJSQU0tRGV2aWNlX3NpemUgaXMgdW5zdXBwb3J0ZWRcbiIpOworCQloYW5nICgpOworCX0KKworCS8qIFNEUkFNIGFkZHJlc3MgY29udHJvbCAqLworCUdUX1JFR19XUklURSAoU0RSQU1fQUREUl9DT05UUk9MLCB0bXApOworCURQIChwcmludGYKKwkgICAgKCJzZXR0aW5nIHVwIHNkcmFtIGFkZHJlc3MgY29udHJvbCAoMHgxNDEwKSB3aXRoOiAlMDhseCBcbiIsCisJICAgICB0bXApKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBzYW1lIHNldHRpbmdzIGZvciByZWdpc3RlcmQgJiBub24tcmVnaXN0ZXJkIEREUiBTRFJBTSAqLworCURQIChwcmludGYKKwkgICAgKCJzZXR0aW5nIHVwIHNkcmFtX3RpbWluZ19jb250cm9sX2xvdyAoMHgxNDA4KSB3aXRoOiAlMDh4IFxuIiwKKwkgICAgIDB4MDE1MDEyMjApKTsKKwkvKnJvbmVuIGRiNjQ0NjAgKi8KKwlHVF9SRUdfV1JJVEUgKFNEUkFNX1RJTUlOR19DT05UUk9MX0xPVywgMHgwMTUwMTIyMCk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBTRFJBTSBjb25maWd1cmF0aW9uICovCisJdG1wID0gR1RSRUdSRUFEIChTRFJBTV9DT05GSUcpOworCisJaWYgKGluZm8tPnJlZ2lzdGVyZWRBZGRyQW5kQ29udHJvbElucHV0cworCSAgICB8fCBpbmZvLT5yZWdpc3RlcmVkRFFNQmlucHV0cykgeworCQl0bXAgfD0gKDEgPDwgMTcpOworCQlEUCAocHJpbnRmCisJCSAgICAoIlNQRCBzYXlzOiByZWdpc3RlcmVkIEFkZHIuIGFuZCBDb250LjogJWQ7IHJlZ2lzdGVyZWQgRFFNQmlucHV0czogJWRcbiIsCisJCSAgICAgaW5mby0+cmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzLAorCQkgICAgIGluZm8tPnJlZ2lzdGVyZWREUU1CaW5wdXRzKSk7CisJfQorCisJLyogVXNlIGJ1ZmZlciAxIHRvIHJldHVybiByZWFkIGRhdGEgdG8gdGhlIENQVQorCSAqIFBhZ2UgNDI2IE1WNmluZGVudDogU3RhbmRhcmQgaW5wdXQ6MTQ2NDogV2FybmluZzpvbGQgc3R5bGUgYXNzaWdubWVudCBhbWJpZ3VpdHkgaW4gIj0qIi4gIEFzc3VtaW5nICI9ICoiCisKK2luZGVudDogU3RhbmRhcmQgaW5wdXQ6MTQ2NTogV2FybmluZzpvbGQgc3R5bGUgYXNzaWdubWVudCBhbWJpZ3VpdHkgaW4gIj0qIi4gIEFzc3VtaW5nICI9ICoiCisKKzQ0NjAgKi8KKwl0bXAgfD0gKDEgPDwgMjYpOworCURQIChwcmludGYKKwkgICAgKCJCZWZvcmUgQnVmZmVyIGFzc2lnbm1lbnQgLSBzZHJhbV9jb25mICgweDE0MDApOiAlMDh4XG4iLAorCSAgICAgR1RSRUdSRUFEIChTRFJBTV9DT05GSUcpKSk7CisJRFAgKHByaW50ZgorCSAgICAoIkFmdGVyIEJ1ZmZlciBhc3NpZ25tZW50IC0gc2RyYW1fY29uZiAoMHgxNDAwKTogJTA4eFxuIiwKKwkgICAgIEdUUkVHUkVBRCAoU0RSQU1fQ09ORklHKSkpOworCisJLyogU0RSQU0gdGltaW5nIFRvX2RvOiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogcm9uZW4gZGI2NDQ2MCAqLworCURQIChwcmludGYKKwkgICAgKCJzZXR0aW5nIHVwIHNkcmFtX3RpbWluZ19jb250cm9sX2hpZ2ggKDB4MTQwYykgd2l0aDogJTA4eCBcbiIsCisJICAgICAweGMpKTsKKwlHVF9SRUdfV1JJVEUgKFNEUkFNX1RJTUlOR19DT05UUk9MX0hJR0gsIDB4Yyk7CisKKwlEUCAocHJpbnRmCisJICAgICgic2V0dGluZyB1cCBzZHJhbSBhZGRyZXNzIHBhZHMgY29udHJvbCAoMHgxNGMwKSB3aXRoOiAlMDh4IFxuIiwKKwkgICAgIDB4N2Q1MDE0YSkpOworCUdUX1JFR19XUklURSAoU0RSQU1fQUREUl9DVFJMX1BBRFNfQ0FMSUJSQVRJT04sIDB4N2Q1MDE0YSk7CisKKwlEUCAocHJpbnRmCisJICAgICgic2V0dGluZyB1cCBzZHJhbSBkYXRhIHBhZHMgY29udHJvbCAoMHgxNGM0KSB3aXRoOiAlMDh4IFxuIiwKKwkgICAgIDB4N2Q1MDE0YSkpOworCUdUX1JFR19XUklURSAoU0RSQU1fREFUQV9QQURTX0NBTElCUkFUSU9OLCAweDdkNTAxNGEpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIHNldCB0aGUgU0RSQU0gY29uZmlndXJhdGlvbiBmb3IgZWFjaCBiYW5rICovCisKKy8qICAgICAgZm9yIChpID0gaW5mby0+c2xvdCAqIDI7IGkgPCAoKGluZm8tPnNsb3QgKiAyKSArIGluZm8tPmJhbmtzKTsgaSsrKSAqLworCXsKKwkJaSA9IGluZm8tPnNsb3Q7CisJCURQIChwcmludGYKKwkJICAgICgiXG4qKiogUnVubmluZyBhIE1SUyBjeWNsZSBmb3IgYmFuayAlZCAqKipcbiIsIGkpKTsKKworCQkvKiBtYXAgdGhlIGJhbmsgKi8KKwkJbWVtb3J5X21hcF9iYW5rIChpLCAwLCBHQiAvIDQpOworCisJCS8qIHNldCBTRFJBTSBtb2RlICovIC8qIFRvX2RvIGNoZWNrIGl0ICovCisJCUdUX1JFR19XUklURSAoU0RSQU1fT1BFUkFUSU9OLCAweDMpOworCQljaGVjayA9IEdUUkVHUkVBRCAoU0RSQU1fT1BFUkFUSU9OKTsKKwkJRFAgKHByaW50ZgorCQkgICAgKCJcbioqKiBTRFJBTV9PUEVSQVRJT04gMTQxOCAoMCA9IE5vcm1hbCBPcGVyYXRpb24pID0gJTA4bHggKioqXG4iLAorCQkgICAgIGNoZWNrKSk7CisKKworCQkvKiBzd2l0Y2ggYmFjayB0byBub3JtYWwgb3BlcmF0aW9uIG1vZGUgKi8KKwkJR1RfUkVHX1dSSVRFIChTRFJBTV9PUEVSQVRJT04sIDApOworCQljaGVjayA9IEdUUkVHUkVBRCAoU0RSQU1fT1BFUkFUSU9OKTsKKwkJRFAgKHByaW50ZgorCQkgICAgKCJcbioqKiBTRFJBTV9PUEVSQVRJT04gMTQxOCAoMCA9IE5vcm1hbCBPcGVyYXRpb24pID0gJTA4bHggKioqXG4iLAorCQkgICAgIGNoZWNrKSk7CisKKwkJLyogdW5tYXAgdGhlIGJhbmsgKi8KKwkJbWVtb3J5X21hcF9iYW5rIChpLCAwLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCisvKgorICogQ2hlY2sgbWVtb3J5IHJhbmdlIGZvciB2YWxpZCBSQU0uIEEgc2ltcGxlIG1lbW9yeSB0ZXN0IGRldGVybWluZXMKKyAqIHRoZSBhY3R1YWxseSBhdmFpbGFibGUgUkFNIHNpemUgYmV0d2VlbiBhZGRyZXNzZXMgYGJhc2UnIGFuZAorICogYGJhc2UgKyBtYXhzaXplJy4gU29tZSAobm90IGFsbCkgaGFyZHdhcmUgZXJyb3JzIGFyZSBkZXRlY3RlZDoKKyAqIC0gc2hvcnQgYmV0d2VlbiBhZGRyZXNzIGxpbmVzCisgKiAtIHNob3J0IGJldHdlZW4gZGF0YSBsaW5lcworICovCitsb25nIGludCBkcmFtX3NpemUgKGxvbmcgaW50ICpiYXNlLCBsb25nIGludCBtYXhzaXplKQoreworCXZvbGF0aWxlIGxvbmcgaW50ICphZGRyLCAqYiA9IGJhc2U7CisJbG9uZyBpbnQgY250LCB2YWwsIHNhdmUxLCBzYXZlMjsKKworI2RlZmluZSBTVEFSVFZBTCAoMTw8MjApCS8qIHN0YXJ0IHRlc3QgYXQgMU0gKi8KKwlmb3IgKGNudCA9IFNUQVJUVkFMIC8gc2l6ZW9mIChsb25nKTsgY250IDwgbWF4c2l6ZSAvIHNpemVvZiAobG9uZyk7CisJICAgICBjbnQgPDw9IDEpIHsKKwkJYWRkciA9IGJhc2UgKyBjbnQ7CS8qIHBvaW50ZXIgYXJpdGghICovCisKKwkJc2F2ZTEgPSAqYWRkcjsJLyogc2F2ZSBjb250ZW50cyBvZiBhZGRyICovCisJCXNhdmUyID0gKmI7CS8qIHNhdmUgY29udGVudHMgb2YgYmFzZSAqLworCisJCSphZGRyID0gY250OwkvKiB3cml0ZSBjbnQgdG8gYWRkciAqLworCQkqYiA9IDA7CQkvKiBwdXQgbnVsbCBhdCBiYXNlICovCisKKwkJLyogY2hlY2sgYXQgYmFzZSBhZGRyZXNzICovCisJCWlmICgoKmIpICE9IDApIHsKKwkJCSphZGRyID0gc2F2ZTE7CS8qIHJlc3RvcmUgKmFkZHIgKi8KKwkJCSpiID0gc2F2ZTI7CS8qIHJlc3RvcmUgKmIgKi8KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJdmFsID0gKmFkZHI7CS8qIHJlYWQgKmFkZHIgKi8KKwkJdmFsID0gKmFkZHI7CS8qIHJlYWQgKmFkZHIgKi8KKworCQkqYWRkciA9IHNhdmUxOworCQkqYiA9IHNhdmUyOworCisJCWlmICh2YWwgIT0gY250KSB7CisJCQlEUCAocHJpbnRmCisJCQkgICAgKCJGb3VuZCAlMDh4ICBhdCBBZGRyZXNzICUwOHggKGZhaWx1cmUpXG4iLAorCQkJICAgICAodW5zaWduZWQgaW50KSB2YWwsICh1bnNpZ25lZCBpbnQpIGFkZHIpKTsKKwkJCS8qIGZpeCBib3VuZGFyeSBjb25kaXRpb24uLiBTVEFSVFZBTCBtZWFucyB6ZXJvICovCisJCQlpZiAoY250ID09IFNUQVJUVkFMIC8gc2l6ZW9mIChsb25nKSkKKwkJCQljbnQgPSAwOworCQkJcmV0dXJuIChjbnQgKiBzaXplb2YgKGxvbmcpKTsKKwkJfQorCX0KKwlyZXR1cm4gbWF4c2l6ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBwcGNib290IGludGVyZmFjZSBmdW5jdGlvbiB0byBTRFJBTSBpbml0IC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhlCisgKiBjb250cm9sbGluZyBsb2dpYyBoYXBwZW5zICovCitsb25nIGludCBpbml0ZHJhbSAoaW50IGJvYXJkX3R5cGUpCit7CisJaW50IHMwID0gMCwgczEgPSAwOworCWludCBjaGVja2JhbmtbNF0gPSB7WzAgLi4uIDNdID0gMCB9OworCXVsb25nIHJlYWxzaXplLCB0b3RhbCwgY2hlY2s7CisJQVVYX01FTV9ESU1NX0lORk8gZGltbUluZm8xOworCUFVWF9NRU1fRElNTV9JTkZPIGRpbW1JbmZvMjsKKwlpbnQgbmhyLCBiYW5rX25vOworCXVsb25nIGRlc3QsIG1lbVNwYWNlQXR0cjsKKworCS8qIGZpcnN0LCB1c2UgdGhlIFNQRCB0byBnZXQgaW5mbyBhYm91dCB0aGUgU0RSQU0vIEREUlJBTSAqLworCisJLyogY2hlY2sgdGhlIE5IUiBiaXQgYW5kIHNraXAgbWVtIGluaXQgaWYgaXQncyBhbHJlYWR5IGRvbmUgKi8KKwluaHIgPSBnZXRfaGlkMCAoKSAmICgxIDw8IDE2KTsKKworCWlmIChuaHIpIHsKKwkJcHJpbnRmICgiU2tpcHBpbmcgU0QtIEREUlJBTSBzZXR1cCBkdWUgdG8gTkhSIGJpdCBiZWluZyBzZXRcbiIpOworCX0gZWxzZSB7CisJCS8qIERJTU0wICovCisJCXMwID0gY2hlY2tfZGltbSAoMCwgJmRpbW1JbmZvMSk7CisKKwkJLyogRElNTTEgKi8KKwkJczEgPSBjaGVja19kaW1tICgxLCAmZGltbUluZm8yKTsKKworCQltZW1vcnlfbWFwX2JhbmsgKDAsIDAsIDApOworCQltZW1vcnlfbWFwX2JhbmsgKDEsIDAsIDApOworCQltZW1vcnlfbWFwX2JhbmsgKDIsIDAsIDApOworCQltZW1vcnlfbWFwX2JhbmsgKDMsIDAsIDApOworCisJCS8qIHJvbmVuIGNoZWNrIGNvcnJlY3Qgc2V0IG9mIERJTU1TICovCisJCWlmIChkaW1tSW5mbzEubnVtT2ZNb2R1bGVCYW5rcyAmJiBkaW1tSW5mbzIubnVtT2ZNb2R1bGVCYW5rcykgeworCQkJaWYgKGRpbW1JbmZvMS5lcnJvckNoZWNrVHlwZSAhPQorCQkJICAgIGRpbW1JbmZvMi5lcnJvckNoZWNrVHlwZSkKKwkJCQlwcmludGYgKCIqKipXQVJOTklORyoqKiEhISEgZGlmZmVyZW50IEVDQyBzdXBwb3J0IG9mIHRoZSBESU1NU1xuIik7CisJCQlpZiAoZGltbUluZm8xLm1heENsU3VwcG9ydGVkX0REUiAhPQorCQkJICAgIGRpbW1JbmZvMi5tYXhDbFN1cHBvcnRlZF9ERFIpCisJCQkJcHJpbnRmICgiKioqV0FSTk5JTkcqKiohISEhIGRpZmZlcmVudCBDQUwgc2V0dGluZyBvZiB0aGUgRElNTVNcbiIpOworCQkJaWYgKGRpbW1JbmZvMS5yZWdpc3RlcmVkQWRkckFuZENvbnRyb2xJbnB1dHMgIT0KKwkJCSAgICBkaW1tSW5mbzIucmVnaXN0ZXJlZEFkZHJBbmRDb250cm9sSW5wdXRzKQorCQkJCXByaW50ZiAoIioqKldBUk5OSU5HKioqISEhISBkaWZmZXJlbnQgUmVnaXN0cmF0aW9uIHNldHRpbmcgb2YgdGhlIERJTU1TXG4iKTsKKwkJfQorCisJCWlmIChkaW1tSW5mbzEubnVtT2ZNb2R1bGVCYW5rcyAmJiBzZXR1cF9zZHJhbSAoJmRpbW1JbmZvMSkpIHsKKwkJCXByaW50ZiAoIlNldHVwIGZvciBESU1NMSBmYWlsZWQuXG4iKTsKKwkJfQorCisJCWlmIChkaW1tSW5mbzIubnVtT2ZNb2R1bGVCYW5rcyAmJiBzZXR1cF9zZHJhbSAoJmRpbW1JbmZvMikpIHsKKwkJCXByaW50ZiAoIlNldHVwIGZvciBESU1NMiBmYWlsZWQuXG4iKTsKKwkJfQorCisJCS8qIHNldCB0aGUgTkhSIGJpdCAqLworCQlzZXRfaGlkMCAoZ2V0X2hpZDAgKCkgfCAoMSA8PCAxNikpOworCX0KKwkvKiBuZXh0LCBzaXplIHRoZSBTRFJBTSBiYW5rcyAqLworCisJcmVhbHNpemUgPSB0b3RhbCA9IDA7CisJY2hlY2sgPSBHQiAvIDQ7CisJaWYgKGRpbW1JbmZvMS5udW1PZk1vZHVsZUJhbmtzID4gMCkgeworCQljaGVja2JhbmtbMF0gPSAxOworCX0KKwlpZiAoZGltbUluZm8xLm51bU9mTW9kdWxlQmFua3MgPiAxKSB7CisJCWNoZWNrYmFua1sxXSA9IDE7CisJfQorCWlmIChkaW1tSW5mbzEubnVtT2ZNb2R1bGVCYW5rcyA+IDIpCisJCXByaW50ZiAoIkVycm9yLCBTUEQgY2xhaW1zIERJTU0xIGhhcyA+MiBiYW5rc1xuIik7CisKKwlwcmludGYgKCItLSBESU1NMSBoYXMgJWQgYmFua3NcbiIsIGRpbW1JbmZvMS5udW1PZk1vZHVsZUJhbmtzKTsKKworCWlmIChkaW1tSW5mbzIubnVtT2ZNb2R1bGVCYW5rcyA+IDApIHsKKwkJY2hlY2tiYW5rWzJdID0gMTsKKwl9CisJaWYgKGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzID4gMSkgeworCQljaGVja2JhbmtbM10gPSAxOworCX0KKwlpZiAoZGltbUluZm8yLm51bU9mTW9kdWxlQmFua3MgPiAyKQorCQlwcmludGYgKCJFcnJvciwgU1BEIGNsYWltcyBESU1NMiBoYXMgPjIgYmFua3NcbiIpOworCisJcHJpbnRmICgiLS0gRElNTTIgaGFzICVkIGJhbmtzXG4iLCBkaW1tSW5mbzIubnVtT2ZNb2R1bGVCYW5rcyk7CisKKwlmb3IgKGJhbmtfbm8gPSAwOyBiYW5rX25vIDwgQ0ZHX0RSQU1fQkFOS1M7IGJhbmtfbm8rKykgeworCQkvKiBza2lwIG92ZXIgYmFua3MgdGhhdCBhcmUgbm90IHBvcHVsYXRlZCAqLworCQlpZiAoIWNoZWNrYmFua1tiYW5rX25vXSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHJvbmVuIC0gcmVhbHNpemUgPSBkcmFtX3NpemUoKGxvbmcgaW50ICopdG90YWwsIGNoZWNrKTsgKi8KKwkJaWYgKGJhbmtfbm8gPT0gMCB8fCBiYW5rX25vID09IDEpIHsKKwkJCWlmIChjaGVja2JhbmtbMV0gPT0gMSkKKwkJCQlyZWFsc2l6ZSA9IGRpbW1JbmZvMS5zaXplIC8gMjsKKwkJCWVsc2UKKwkJCQlyZWFsc2l6ZSA9IGRpbW1JbmZvMS5zaXplOworCQl9CisJCWlmIChiYW5rX25vID09IDIgfHwgYmFua19ubyA9PSAzKSB7CisJCQlpZiAoY2hlY2tiYW5rWzNdID09IDEpCisJCQkJcmVhbHNpemUgPSBkaW1tSW5mbzIuc2l6ZSAvIDI7CisJCQllbHNlCisJCQkJcmVhbHNpemUgPSBkaW1tSW5mbzIuc2l6ZTsKKwkJfQorCQltZW1vcnlfbWFwX2JhbmsgKGJhbmtfbm8sIHRvdGFsLCByZWFsc2l6ZSk7CisKKwkJLyogcm9uZW4gLSBpbml0aWFsaXplIHRoZSBEUkFNIGZvciBFQ0MgKi8KKyNpZmRlZiBDT05GSUdfTVY2NDQ2MF9FQ0MKKwkJaWYgKChkaW1tSW5mbzEuZXJyb3JDaGVja1R5cGUgIT0gMCkgJiYKKwkJICAgICgoZGltbUluZm8yLmVycm9yQ2hlY2tUeXBlICE9IDApCisJCSAgICAgfHwgKGRpbW1JbmZvMi5udW1PZk1vZHVsZUJhbmtzID09IDApKSkgeworCQkJcHJpbnRmICgiRUNDIEluaXRpYWxpemF0aW9uIG9mIEJhbmsgJWQ6IiwgYmFua19ubyk7CisJCQltZW1TcGFjZUF0dHIgPSAoKH4oQklUMCA8PCBiYW5rX25vKSkgJiAweGYpIDw8IDg7CisJCQltdkRtYVNldE1lbW9yeVNwYWNlICgwLCAwLCBtZW1TcGFjZUF0dHIsIHRvdGFsLAorCQkJCQkgICAgIHJlYWxzaXplKTsKKwkJCWZvciAoZGVzdCA9IHRvdGFsOyBkZXN0IDwgdG90YWwgKyByZWFsc2l6ZTsKKwkJCSAgICAgZGVzdCArPSBfOE0pIHsKKwkJCQltdkRtYVRyYW5zZmVyICgwLCB0b3RhbCwgZGVzdCwgXzhNLAorCQkJCQkgICAgICAgQklUOCAvKkRNQV9EVExfMTI4QllURVMgKi8gIHwKKwkJCQkJICAgICAgIEJJVDMgLypETUFfSE9MRF9TT1VSQ0VfQUREUiAqLworCQkJCQkgICAgICAgfAorCQkJCQkgICAgICAgQklUMTEKKwkJCQkJICAgICAgIC8qRE1BX0JMT0NLX1RSQU5TRkVSX01PREUgKi8gKTsKKwkJCQl3aGlsZSAobXZEbWFJc0NoYW5uZWxBY3RpdmUgKDApKTsKKwkJCX0KKwkJCXByaW50ZiAoIiBQQVNTXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJdG90YWwgKz0gcmVhbHNpemU7CisJfQorCisJLyogcm9uZW4gKi8KKwlzd2l0Y2ggKChHVFJFR1JFQUQgKDB4MTQxYykgPj4gNCkgJiAweDcpIHsKKwljYXNlIDB4MjoKKwkJcHJpbnRmICgiQ0FTIExhdGVuY3kgPSAyIik7CisJCWJyZWFrOworCWNhc2UgMHgzOgorCQlwcmludGYgKCJDQVMgTGF0ZW5jeSA9IDMiKTsKKwkJYnJlYWs7CisJY2FzZSAweDU6CisJCXByaW50ZiAoIkNBUyBMYXRlbmN5ID0gMS41Iik7CisJCWJyZWFrOworCWNhc2UgMHg2OgorCQlwcmludGYgKCJDQVMgTGF0ZW5jeSA9IDIuNSIpOworCQlicmVhazsKKwl9CisJcHJpbnRmICgiIHRSUCA9ICVkIHRSQVMgPSAlZCB0UkNEPSVkXG4iLAorCQkoKEdUUkVHUkVBRCAoMHgxNDA4KSA+PiA4KSAmIDB4ZikgKyAxLAorCQkoKEdUUkVHUkVBRCAoMHgxNDA4KSA+PiAyMCkgJiAweGYpICsgMSwKKwkJKChHVFJFR1JFQUQgKDB4MTQwOCkgPj4gNCkgJiAweGYpICsgMSk7CisKKy8qCVNldHVwIEV0aGVybmV0IERNQSBBZHJlc3Mgd2luZG93IHRvIERSQU0gQXJlYSAqLworCWlmICh0b3RhbCA+IF8yNTZNKQorCQlwcmludGYgKCIqKiogT05MWSB0aGUgZmlyc3QgMjU2TUIgRFJBTSBtZW1vcnkgYXJlIHVzZWQgb3V0IG9mIHRoZSAiKTsKKwllbHNlCisJCXByaW50ZiAoIlRvdGFsIFNEUkFNIG1lbW9yeSBpcyAiKTsKKwkvKiAoY2F1c2UgYWxsIHRoZSA0IEJBVFMgYXJlIHRha2VuKSAqLworCXJldHVybiAodG90YWwpOworfQorCisKKy8qIHJvbmVuLSBhZGQgSWRtYSBmdW5jdGlvbnMgZm9yIHVzYWdlIG9mIHRoZSBlY2MgZHJhbSBpbml0LiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZEbWFJc0NoYW5uZWxBY3RpdmUgLSBDaGVja3MgaWYgYSBlbmdpbmUgaXMgYnVzeS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG12RG1hSXNDaGFubmVsQWN0aXZlIChpbnQgZW5naW5lKQoreworCXVsb25nIGRhdGE7CisKKwlkYXRhID0gR1RSRUdSRUFEIChNVjY0NDYwX0RNQV9DSEFOTkVMMF9DT05UUk9MICsgNCAqIGVuZ2luZSk7CisJaWYgKGRhdGEgJiBCSVQxNCAvKmFjdGl2aXR5IHN0YXR1cyAqLyApIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkRtYVNldE1lbW9yeVNwYWNlIC0gU2V0IGEgRE1BIG1lbW9yeSB3aW5kb3cgZm9yIHRoZSBETUEncyBhZGRyZXNzIGRlY29kaW5nCisqICAgICAgICAgICAgICAgICAgICAgICBtYXAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG12RG1hU2V0TWVtb3J5U3BhY2UgKHVsb25nIG1lbVNwYWNlLAorCQkJIHVsb25nIG1lbVNwYWNlVGFyZ2V0LAorCQkJIHVsb25nIG1lbVNwYWNlQXR0ciwgdWxvbmcgYmFzZUFkZHJlc3MsIHVsb25nIHNpemUpCit7CisJdWxvbmcgdGVtcDsKKworCS8qIFRoZSBiYXNlIGFkZHJlc3MgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzaXplLiAgKi8KKwlpZiAoYmFzZUFkZHJlc3MgJSBzaXplICE9IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzaXplID49IDB4MTAwMDAgLyo2NEsgKi8gKSB7CisJCXNpemUgJj0gMHhmZmZmMDAwMDsKKwkJYmFzZUFkZHJlc3MgPSAoYmFzZUFkZHJlc3MgJiAweGZmZmYwMDAwKTsKKwkJLyogU2V0IHRoZSBuZXcgYXR0cmlidXRlcyAqLworCQlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRE1BX0JBU0VfQUREUl9SRUcwICsgbWVtU3BhY2UgKiA4LAorCQkJICAgICAgKGJhc2VBZGRyZXNzIHwgbWVtU3BhY2VUYXJnZXQgfCBtZW1TcGFjZUF0dHIpKTsKKwkJR1RfUkVHX1dSSVRFICgoTVY2NDQ2MF9ETUFfU0laRV9SRUcwICsgbWVtU3BhY2UgKiA4KSwKKwkJCSAgICAgIChzaXplIC0gMSkgJiAweGZmZmYwMDAwKTsKKwkJdGVtcCA9IEdUUkVHUkVBRCAoTVY2NDQ2MF9ETUFfQkFTRV9BRERSX0VOQUJMRV9SRUcpOworCQlHVF9SRUdfV1JJVEUgKERNQV9CQVNFX0FERFJfRU5BQkxFX1JFRywKKwkJCSAgICAgICh0ZW1wICYgfihCSVQwIDw8IG1lbVNwYWNlKSkpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZEbWFUcmFuc2ZlciAtIFRyYW5zZmVyIGRhdGEgZnJvbSBzb3VyY2VBZGRyIHRvIGRlc3RBZGRyIG9uIG9uZSBvZiB0aGUgNAorKiAgICAgICAgICAgICAgICAgRE1BIGNoYW5uZWxzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbXZEbWFUcmFuc2ZlciAoaW50IGVuZ2luZSwgdWxvbmcgc291cmNlQWRkciwKKwkJICAgdWxvbmcgZGVzdEFkZHIsIHVsb25nIG51bU9mQnl0ZXMsIHVsb25nIGNvbW1hbmQpCit7CisJdWxvbmcgZW5nT2ZmUmVnID0gMDsJLyogRW5naW5lIE9mZnNldCBSZWdpc3RlciAqLworCisJaWYgKG51bU9mQnl0ZXMgPiAweGZmZmYpIHsKKwkJY29tbWFuZCA9IGNvbW1hbmQgfCBCSVQzMSAvKkRNQV8xNk1fREVTQ1JJUFRPUl9NT0RFICovIDsKKwl9CisJY29tbWFuZCA9IGNvbW1hbmQgfCAoKGNvbW1hbmQgPj4gNikgJiAweDcpOworCWVuZ09mZlJlZyA9IGVuZ2luZSAqIDQ7CisJR1RfUkVHX1dSSVRFIChNVjY0NDYwX0RNQV9DSEFOTkVMMF9CWVRFX0NPVU5UICsgZW5nT2ZmUmVnLAorCQkgICAgICBudW1PZkJ5dGVzKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRE1BX0NIQU5ORUwwX1NPVVJDRV9BRERSICsgZW5nT2ZmUmVnLAorCQkgICAgICBzb3VyY2VBZGRyKTsKKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRE1BX0NIQU5ORUwwX0RFU1RJTkFUSU9OX0FERFIgKyBlbmdPZmZSZWcsCisJCSAgICAgIGRlc3RBZGRyKTsKKwljb21tYW5kID0KKwkJY29tbWFuZCB8IEJJVDEyIC8qRE1BX0NIQU5ORUxfRU5BQkxFICovICB8IEJJVDkKKwkJLypETUFfTk9OX0NIQUlOX01PREUgKi8gOworCS8qIEFjdGl2YXRlIERNQSBlbmdpbmUgQnkgd3JpdHRpbmcgdG8gbXZEbWFDb250cm9sUmVnaXN0ZXIgKi8KKwlHVF9SRUdfV1JJVEUgKE1WNjQ0NjBfRE1BX0NIQU5ORUwwX0NPTlRST0wgKyBlbmdPZmZSZWcsIGNvbW1hbmQpOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkgICAgICAgU0RSQU0gSU5JVAkJCQkJCSoKKyAqICBUaGlzIHByb2NlZHVyZSBkZXRlY3QgYWxsIFNkcmFtIHR5cGVzOiA2NCwgMTI4LCAyNTYsIDUxMiBNYml0LCAxR2JpdCBhbmQgMkdiCSoKKyAqCQkgVGhpcyBwcm9jZWR1cmUgZml0cyBvbmx5IHRoZSBBdGxhbnRpcwkJCQkJKgorICoJCQkJCQkJCQkJCSoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJICAgICAgIERGQ0RMIGluaXRpYWxpemUgTVY2NDN4eCBEZXNpZ24gQ29uc2lkZXJhdGlvbnMJCSoKKyAqCQkJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHNldF9kZmNkbEluaXQgKHZvaWQpCit7CisJLypyb25lbiB0aGUgZGZjZGwgaW5pdCBhcmUgZG9uZSBieSB0aGUgSTJDICovCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC91LWJvb3QubGRzIGIvYm9hcmQvTWFydmVsbC9kYjY0NDYwL3UtYm9vdC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYThjMAotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL01hcnZlbGwvZGI2NDQ2MC91LWJvb3QubGRzCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBKb3NoIEh1YmVyIDxodWJlckBtY2x4LmNvbT4sIE1pc3Npb24gQ3JpdGljYWwgTGludXgsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogdS1ib290LmxkcyAtIGxpbmtlciBzY3JpcHQgZm9yIFUtQm9vdCBvbiB0aGUgR2FsaWxlbyBFdmFsIEJvYXJkLgorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCitTRUFSQ0hfRElSKC9saWIpOyBTRUFSQ0hfRElSKC91c3IvbGliKTsgU0VBUkNIX0RJUigvdXNyL2xvY2FsL2xpYik7IFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFueS1lbGYvbGliKTsKKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/CisgICBfX0RZTkFNSUMgPSAwOyAgICAqLworU0VDVElPTlMKK3sKKyAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovCisgIC4gPSArIFNJWkVPRl9IRUFERVJTOworICAuaW50ZXJwIDogeyAqKC5pbnRlcnApIH0KKyAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9CisgIC5keW5zeW0gICAgICAgIDogeyAqKC5keW5zeW0pCQl9CisgIC5keW5zdHIgICAgICAgIDogeyAqKC5keW5zdHIpCQl9CisgIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX0KKyAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfQorICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX0KKyAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgY3B1Lzc0eHhfN3h4L3N0YXJ0Lm8JKC50ZXh0KQorCisvKiBzdG9yZSB0aGUgZW52aXJvbm1lbnQgaW4gYSBzZXBlcmF0ZSBzZWN0b3IgaW4gdGhlIGJvb3QgZmxhc2ggKi8KKy8qICAgIC4gPSBlbnZfb2Zmc2V0OyAqLworLyogICAgY29tbW9uL2Vudmlyb25tZW50Lm8oLnRleHQpICovCisKKyAgICAqKC50ZXh0KQorICAgICooLmZpeHVwKQorICAgICooLmdvdDEpCisgIH0KKyAgX2V0ZXh0ID0gLjsKKyAgUFJPVklERSAoZXRleHQgPSAuKTsKKyAgLnJvZGF0YSAgICA6CisgIHsKKyAgICAqKC5yb2RhdGEpCisgICAgKigucm9kYXRhMSkKKyAgICAqKC5yb2RhdGEuc3RyMS40KQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MDBGRikgJiAweEZGRkZGRjAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PjI7CisgIF9fZml4dXBfZW50cmllcyA9ICguIC0gX0ZJWFVQX1RBQkxFXyk+PjI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgX191X2Jvb3RfY21kX3N0YXJ0ID0gLjsKKyAgLnVfYm9vdF9jbWQgOiB7ICooLnVfYm9vdF9jbWQpIH0KKyAgX191X2Jvb3RfY21kX2VuZCA9IC47CisKKworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTigyNTYpOworICBfX2luaXRfZW5kID0gLjsKKworICBfX2Jzc19zdGFydCA9IC47CisgIC5ic3MgICAgICAgOgorICB7CisgICAqKC5zYnNzKSAqKC5zY29tbW9uKQorICAgKiguZHluYnNzKQorICAgKiguYnNzKQorICAgKihDT01NT04pCisgIH0KKyAgX2VuZCA9IC4gOworICBQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvaW5jbHVkZS9jb3JlLmggYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWQ1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvY29yZS5oCkBAIC0wLDAgKzEsMjM4IEBACisvKiBDb3JlLmggLSBCYXNpYyBjb3JlIGxvZ2ljIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgKi8KKworLyogQ29weXJpZ2h0IEdhbGlsZW8gVGVjaG5vbG9neS4gKi8KKworLyoKK0RFU0NSSVBUSU9OCitUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHNpbXBsZSByZWFkL3dyaXRlIG1hY3JvcyBmb3IgYWRkcmVzc2luZwordGhlIFNEUkFNLCBkZXZpY2VzLCBHVGBzIGludGVybmFsIHJlZ2lzdGVycyBhbmQgUENJICh1c2luZyB0aGUgUENJYHMgYWRkcmVzcworc3BhY2UpLiBUaGUgbWFjcm9zIHRha2UgY2FyZSBvZiBCaWcvTGl0dGxlIGVuZGlhbiBjb252ZXJzaW9ucy4KKyovCisKKyNpZm5kZWYgX19JTkNjb3JlaAorI2RlZmluZSBfX0lOQ2NvcmVoCisKKyNpbmNsdWRlICJtdl9nZW5fcmVnLmgiCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgSU5URVJOQUxfUkVHX0JBU0VfQUREUjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgR0VORVJBTCBEZWZpbml0aW9ucwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBOT19CSVQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQklUMAkJMHgwMDAwMDAwMQorI2RlZmluZSBCSVQxCQkweDAwMDAwMDAyCisjZGVmaW5lIEJJVDIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMwkJMHgwMDAwMDAwOAorI2RlZmluZSBCSVQ0CQkweDAwMDAwMDEwCisjZGVmaW5lIEJJVDUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNgkJMHgwMDAwMDA0MAorI2RlZmluZSBCSVQ3CQkweDAwMDAwMDgwCisjZGVmaW5lIEJJVDgJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQklUOQkJMHgwMDAwMDIwMAorI2RlZmluZSBCSVQxMAkJMHgwMDAwMDQwMAorI2RlZmluZSBCSVQxMQkJMHgwMDAwMDgwMAorI2RlZmluZSBCSVQxMgkJMHgwMDAwMTAwMAorI2RlZmluZSBCSVQxMwkJMHgwMDAwMjAwMAorI2RlZmluZSBCSVQxNAkJMHgwMDAwNDAwMAorI2RlZmluZSBCSVQxNQkJMHgwMDAwODAwMAorI2RlZmluZSBCSVQxNgkJMHgwMDAxMDAwMAorI2RlZmluZSBCSVQxNwkJMHgwMDAyMDAwMAorI2RlZmluZSBCSVQxOAkJMHgwMDA0MDAwMAorI2RlZmluZSBCSVQxOQkJMHgwMDA4MDAwMAorI2RlZmluZSBCSVQyMAkJMHgwMDEwMDAwMAorI2RlZmluZSBCSVQyMQkJMHgwMDIwMDAwMAorI2RlZmluZSBCSVQyMgkJMHgwMDQwMDAwMAorI2RlZmluZSBCSVQyMwkJMHgwMDgwMDAwMAorI2RlZmluZSBCSVQyNAkJMHgwMTAwMDAwMAorI2RlZmluZSBCSVQyNQkJMHgwMjAwMDAwMAorI2RlZmluZSBCSVQyNgkJMHgwNDAwMDAwMAorI2RlZmluZSBCSVQyNwkJMHgwODAwMDAwMAorI2RlZmluZSBCSVQyOAkJMHgxMDAwMDAwMAorI2RlZmluZSBCSVQyOQkJMHgyMDAwMDAwMAorI2RlZmluZSBCSVQzMAkJMHg0MDAwMDAwMAorI2RlZmluZSBCSVQzMQkJMHg4MDAwMDAwMAorCisjZGVmaW5lIF8xSwkJMHgwMDAwMDQwMAorI2RlZmluZSBfMksJCTB4MDAwMDA4MDAKKyNkZWZpbmUgXzRLCQkweDAwMDAxMDAwCisjZGVmaW5lIF84SwkJMHgwMDAwMjAwMAorI2RlZmluZSBfMTZLCQkweDAwMDA0MDAwCisjZGVmaW5lIF8zMksJCTB4MDAwMDgwMDAKKyNkZWZpbmUgXzY0SwkJMHgwMDAxMDAwMAorI2RlZmluZSBfMTI4SwkJMHgwMDAyMDAwMAorI2RlZmluZSBfMjU2SwkJMHgwMDA0MDAwMAorI2RlZmluZSBfNTEySwkJMHgwMDA4MDAwMAorCisjZGVmaW5lIF8xTQkJMHgwMDEwMDAwMAorI2RlZmluZSBfMk0JCTB4MDAyMDAwMDAKKyNkZWZpbmUgXzNNCQkweDAwMzAwMDAwCisjZGVmaW5lIF80TQkJMHgwMDQwMDAwMAorI2RlZmluZSBfNU0JCTB4MDA1MDAwMDAKKyNkZWZpbmUgXzZNCQkweDAwNjAwMDAwCisjZGVmaW5lIF83TQkJMHgwMDcwMDAwMAorI2RlZmluZSBfOE0JCTB4MDA4MDAwMDAKKyNkZWZpbmUgXzlNCQkweDAwOTAwMDAwCisjZGVmaW5lIF8xME0JCTB4MDBhMDAwMDAKKyNkZWZpbmUgXzExTQkJMHgwMGIwMDAwMAorI2RlZmluZSBfMTJNCQkweDAwYzAwMDAwCisjZGVmaW5lIF8xM00JCTB4MDBkMDAwMDAKKyNkZWZpbmUgXzE0TQkJMHgwMGUwMDAwMAorI2RlZmluZSBfMTVNCQkweDAwZjAwMDAwCisjZGVmaW5lIF8xNk0JCTB4MDEwMDAwMDAKKworI2RlZmluZSBfMzJNCQkweDAyMDAwMDAwCisjZGVmaW5lIF82NE0JCTB4MDQwMDAwMDAKKyNkZWZpbmUgXzEyOE0JCTB4MDgwMDAwMDAKKyNkZWZpbmUgXzI1Nk0JCTB4MTAwMDAwMDAKKyNkZWZpbmUgXzUxMk0JCTB4MjAwMDAwMDAKKworI2RlZmluZSBfMUcJCTB4NDAwMDAwMDAKKyNkZWZpbmUgXzJHCQkweDgwMDAwMDAwCisKK3R5cGVkZWYgZW51bSBfYm9vbHtmYWxzZSx0cnVlfSBib29sOworCisvKiBMaXR0bGUgdG8gQmlnIGVuZGlhbiBjb252ZXJzaW9uIG1hY3JvcyAqLworCisjaWZkZWYgTEUgLyogTGl0dGxlIEVuZGlhbiAqLworI2RlZmluZSBTSE9SVF9TV0FQKFgpIChYKQorI2RlZmluZSBXT1JEX1NXQVAoWCkgKFgpCisjZGVmaW5lIExPTkdfU1dBUChYKSAoKGw2NCkoWCkpCisKKyNlbHNlCSAvKiBCaWcgRW5kaWFuICovCisjZGVmaW5lIFNIT1JUX1NXQVAoWCkgKChYIDw8OCApIHwgKFggPj4gOCkpCisKKyNkZWZpbmUgV09SRF9TV0FQKFgpICgoKFgpJjB4ZmYpPDwyNCkrCSAgICBcCisJCSAgICAoKChYKSYweGZmMDApPDw4KSsJICAgIFwKKwkJICAgICgoKFgpJjB4ZmYwMDAwKT4+OCkrICAgIFwKKwkJICAgICgoKFgpJjB4ZmYwMDAwMDApPj4yNCkKKworI2RlZmluZSBMT05HX1NXQVAoWCkgKCAobDY0KSAoKChYKSYweGZmVUxMKTw8NTYpKwkJXAorCQkJICAgICgoKFgpJjB4ZmYwMFVMTCk8PDQwKSsJCVwKKwkJCSAgICAoKChYKSYweGZmMDAwMFVMTCk8PDI0KSsJCVwKKwkJCSAgICAoKChYKSYweGZmMDAwMDAwVUxMKTw8OCkrCQlcCisJCQkgICAgKCgoWCkmMHhmZjAwMDAwMDAwVUxMKT4+OCkrCQlcCisJCQkgICAgKCgoWCkmMHhmZjAwMDAwMDAwMDBVTEwpPj4yNCkrCVwKKwkJCSAgICAoKChYKSYweGZmMDAwMDAwMDAwMDAwVUxMKT4+NDApKwlcCisJCQkgICAgKCgoWCkmMHhmZjAwMDAwMDAwMDAwMDAwVUxMKT4+NTYpKQorCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgMAorI2VuZGlmCisKKy8qIFRob3NlIHR3byBkZWZpbml0aW9ucyB3ZXJlIGRlZmluZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIE1JUFMgKi8KKyNkZWZpbmUgTk9ORV9DQUNIRUFCTEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ0FDSEVBQkxFCQkJMHgwMDAwMDAwMAorCisvKiA3NTAgY2FjaGUgbGluZSAqLworI2RlZmluZSBDQUNIRV9MSU5FX1NJWkUgMzIKKyNkZWZpbmUgQ0FDSEVMSU5FX01BU0tfQklUUyAoQ0FDSEVfTElORV9TSVpFIC0gMSkKKyNkZWZpbmUgQ0FDSEVMSU5FX1JPVU5EVVAoQSkgKCgoQSkrQ0FDSEVMSU5FX01BU0tfQklUUykgJiB+Q0FDSEVMSU5FX01BU0tfQklUUykKKworLyogUmVhZC9Xcml0ZSB0by9mcm9tIEdUYHMgaW50ZXJuYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIEdUX1JFR19SRUFEKG9mZnNldCwgcERhdGEpCQkJCQkgICAgXAorKnBEYXRhID0gKCAqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoTk9ORV9DQUNIRUFCTEUgfAkJCSAgICBcCisJCUlOVEVSTkFMX1JFR19CQVNFX0FERFIgfCAob2Zmc2V0KSkpICkgOwkJCQkJCSAgICAgXAorKnBEYXRhID0gV09SRF9TV0FQKCpwRGF0YSkKKworI2RlZmluZSBHVFJFR1JFQUQob2Zmc2V0KQkJCQkJCSAgICBcCisJIChXT1JEX1NXQVAoICooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShOT05FX0NBQ0hFQUJMRSB8CSAgICAgXAorCQkgICBJTlRFUk5BTF9SRUdfQkFTRV9BRERSIHwgKG9mZnNldCkpKSApKQorCisjZGVmaW5lIEdUX1JFR19XUklURShvZmZzZXQsIGRhdGEpCQkJCQkgICAgXAorKigodW5zaWduZWQgaW50ICopKCBJTlRFUk5BTF9SRUdfQkFTRV9BRERSIHwgKG9mZnNldCkpKSA9CQkgICAgXAorCQkgICAgV09SRF9TV0FQKGRhdGEpCisKKy8qIFdyaXRlIDMyLzE2LzggYml0ICovCisjZGVmaW5lIFdSSVRFX0NIQVIoYWRkcmVzcywgZGF0YSkJCQkJCSAgICBcCisJKigodW5zaWduZWQgY2hhciAqKShhZGRyZXNzKSkgPSBkYXRhCisjZGVmaW5lIFdSSVRFX1NIT1JUKGFkZHJlc3MsIGRhdGEpCQkJCQkgICAgXAorCSooKHVuc2lnbmVkIHNob3J0ICopKGFkZHJlc3MpKSA9IGRhdGEKKyNkZWZpbmUgV1JJVEVfV09SRChhZGRyZXNzLCBkYXRhKQkJCQkJICAgIFwKKwkqKCh1bnNpZ25lZCBpbnQgKikoYWRkcmVzcykpID0gZGF0YQorCisjZGVmaW5lIEdUX1dSSVRFX0NIQVIoYWRkcmVzcywgZGF0YSkJIFdSSVRFX0NIQVIoYWRkcmVzcywgZGF0YSkKKworLyogV3JpdGUgMzIvMTYvOCBiaXQgTm9uQ2FjaGVhYmxlICovCisvKgorI2RlZmluZSBHVF9XUklURV9DSEFSKGFkZHJlc3MsIGRhdGEpCQkJCQkgICAgICAgXAorCSgqKCh1bnNpZ25lZCBjaGFyICopTk9ORV9DQUNIRUFCTEUoYWRkcmVzcykpKSA9IGRhdGEKKyNkZWZpbmUgR1RfV1JJVEVfU0hPUlQoYWRkcmVzcywgZGF0YSkJCQkJCSAgICAgICBcCisJKCooKHVuc2lnbmVkIHNob3J0ICopTk9ORV9DQUNIRUFCTEUoYWRkcmVzcykpKSA9IGRhdGEKKyNkZWZpbmUgR1RfV1JJVEVfV09SRChhZGRyZXNzLCBkYXRhKQkJCQkJICAgICAgIFwKKwkoKigodW5zaWduZWQgaW50ICopTk9ORV9DQUNIRUFCTEUoYWRkcmVzcykpKSA9IGRhdGEKKyovCisgLyojZGVmaW5lIEdUX1dSSVRFX0NIQVIoYWRkcmVzcywgZGF0YSkJICAoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilOT05FX0NBQ0hFQUJMRSgoYWRkcmVzcykpKSkgPSAoKHVuc2lnbmVkIGNoYXIpKGRhdGEpKSkxICovCisKKyAvKiNkZWZpbmUgR1RfV1JJVEVfU0hPUlQoYWRkcmVzcywgZGF0YSkgICAoKCooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopTk9ORV9DQUNIRUFCTEUoKGFkZHJlc3MpKSkpID0gKCh1bnNpZ25lZCBzaG9ydCkoZGF0YSkpKTEgKi8KKworIC8qI2RlZmluZSBHVF9XUklURV9XT1JEKGFkZHJlc3MsIGRhdGEpCSAoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKU5PTkVfQ0FDSEVBQkxFKChhZGRyZXNzKSkpKSA9ICgodW5zaWduZWQgaW50KShkYXRhKSkpMSAqLworCisKKy8qIFJlYWQgMzIvMTYvOCBiaXRzIC0gcmV0dXJucyBkYXRhIGluIHZhcmlhYmxlLiAqLworI2RlZmluZSBSRUFEX0NIQVIoYWRkcmVzcywgcERhdGEpCQkJCQkgICAgXAorCSpwRGF0YSA9ICooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYWRkcmVzcykpCisKKyNkZWZpbmUgUkVBRF9TSE9SVChhZGRyZXNzLCBwRGF0YSkJCQkJCSAgICBcCisJKnBEYXRhID0gKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYWRkcmVzcykpCisKKyNkZWZpbmUgUkVBRF9XT1JEKGFkZHJlc3MsIHBEYXRhKQkJCQkJICAgIFwKKwkqcERhdGEgPSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcmVzcykpCisKKy8qIFJlYWQgMzIvMTYvOCBiaXQgLSByZXR1cm5zIGRhdGEgZGlyZWN0LiAqLworI2RlZmluZSBSRUFEQ0hBUihhZGRyZXNzKQkJCQkJCSAgICBcCisJKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgoYWRkcmVzcykgfCBOT05FX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgUkVBRFNIT1JUKGFkZHJlc3MpCQkJCQkJICAgIFwKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcmVzcykgfCBOT05FX0NBQ0hFQUJMRSkpCisKKyNkZWZpbmUgUkVBRFdPUkQoYWRkcmVzcykJCQkJCQkgICAgXAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSgoYWRkcmVzcykgfCBOT05FX0NBQ0hFQUJMRSkpCisKKy8qIFRob3NlIHR3byBNYWNyb3Mgd2VyZSBkZWZpbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBNSVBTICovCisjZGVmaW5lIFZJUlRVQUxfVE9fUEhZKHgpICAgICgoKHVuc2lnbmVkIGludCl4KSAmIDB4ZmZmZmZmZmYpCisjZGVmaW5lIFBIWV9UT19WSVJUVUFMKHgpICAgICgoKHVuc2lnbmVkIGludCl4KSB8IE5PTkVfQ0FDSEVBQkxFKQorCisvKiAgU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKSAtCisgICBnZXRzIHJlZ2lzdGVyIG9mZnNldCBhbmQgYml0czogYSAzMmJpdCB2YWx1ZS4gSXQgc2V0IHRvIGxvZ2ljICcxJyBpbiB0aGUKKyAgIGludGVybmFsIHJlZ2lzdGVyIHRoZSBiaXRzIHdoaWNoIGdpdmVuIGFzIGFuIGlucHV0IGV4YW1wbGU6CisgICBTRVRfUkVHX0JJVFMoMHg4NDAsQklUMyB8IEJJVDI0IHwgQklUMzApIC0gc2V0IGJpdHM6IDMsMjQgYW5kIDMwIHRvIGxvZ2ljCisgICAnMScgaW4gcmVnaXN0ZXIgMHg4NDAgd2hpbGUgdGhlIG90aGVyIGJpdHMgc3RheXMgYXMgaXMuICovCisjZGVmaW5lIFNFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykgXAorCSoodW5zaWduZWQgaW50KikoTk9ORV9DQUNIRUFCTEUgfCBJTlRFUk5BTF9SRUdfQkFTRV9BRERSIHwgIFwKKwlyZWdPZmZzZXQpIHw9ICh1bnNpZ25lZCBpbnQpV09SRF9TV0FQKGJpdHMpCisKKy8qICBSRVNFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykgLQorICAgZ2V0cyByZWdpc3RlciBvZmZzZXQgYW5kIGJpdHM6IGEgMzJiaXQgdmFsdWUuIEl0IHNldCB0byBsb2dpYyAnMCcgaW4gdGhlCisgICBpbnRlcm5hbCByZWdpc3RlciB0aGUgYml0cyB3aGljaCBnaXZlbiBhcyBhbiBpbnB1dCBleGFtcGxlOgorICAgUkVTRVRfUkVHX0JJVFMoMHg4NDAsQklUMyB8IEJJVDI0IHwgQklUMzApIC0gc2V0IGJpdHM6IDMsMjQgYW5kIDMwIHRvIGxvZ2ljCisgICAnMCcgaW4gcmVnaXN0ZXIgMHg4NDAgd2hpbGUgdGhlIG90aGVyIGJpdHMgc3RheXMgYXMgaXMuICovCisjZGVmaW5lIFJFU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKSBcCisJKih1bnNpZ25lZCBpbnQqKShOT05FX0NBQ0hFQUJMRSB8IElOVEVSTkFMX1JFR19CQVNFX0FERFIgICBcCisJfCByZWdPZmZzZXQpICY9IH4oICh1bnNpZ25lZCBpbnQpV09SRF9TV0FQKGJpdHMpICkKKy8qIGdldHMgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBiaXRzOiBhIDMyYml0IHZhbHVlLiBJdCBzZXQgdG8gbG9naWMgJzEnIGluIHRoZQorICAgaW50ZXJuYWwgcmVnaXN0ZXIgdGhlIGJpdHMgd2hpY2ggZ2l2ZW4gYXMgYW4gaW5wdXQgZXhhbXBsZToKKyAgIEdUX1NFVF9SRUdfQklUUygweDg0MCxCSVQzIHwgQklUMjQgfCBCSVQzMCkgLSBzZXQgYml0czogMywyNCBhbmQgMzAgdG8gbG9naWMKKyAgICcxJyBpbiByZWdpc3RlciAweDg0MCB3aGlsZSB0aGUgb3RoZXIgYml0cyBzdGF5cyBhcyBpcy4gKi8KKyAvKiNkZWZpbmUgR1RfU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKQkoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGludCopKE5PTkVfQ0FDSEVBQkxFKElOVEVSTkFMX1JFR19CQVNFX0FERFIpIHwgKHJlZ09mZnNldCkpKSkgfD0gKCh1bnNpZ25lZCBpbnQpV09SRF9TV0FQKGJpdHMpKSkxICovCisgLyojZGVmaW5lIEdUX1NFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykgUkVTRVRfUkVHX0JJVFMocmVnT2Zmc2V0LGJpdHMpMSAqLworI2RlZmluZSBHVF9TRVRfUkVHX0JJVFMocmVnT2Zmc2V0LGJpdHMpIFNFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykKKy8qIGdldHMgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBiaXRzOiBhIDMyYml0IHZhbHVlLiBJdCBzZXQgdG8gbG9naWMgJzAnIGluIHRoZQorICAgaW50ZXJuYWwgcmVnaXN0ZXIgdGhlIGJpdHMgd2hpY2ggZ2l2ZW4gYXMgYW4gaW5wdXQgZXhhbXBsZToKKyAgIEdUX1JFU0VUX1JFR19CSVRTKDB4ODQwLEJJVDMgfCBCSVQyNCB8IEJJVDMwKSAtIHNldCBiaXRzOiAzLDI0IGFuZCAzMCB0bworICAgbG9naWMgJzAnIGluIHJlZ2lzdGVyIDB4ODQwIHdoaWxlIHRoZSBvdGhlciBiaXRzIHN0YXlzIGFzIGlzLiAqLworIC8qI2RlZmluZSBHVF9SRVNFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykJKCgqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKShOT05FX0NBQ0hFQUJMRShJTlRFUk5BTF9SRUdfQkFTRV9BRERSKSB8ICAocmVnT2Zmc2V0KSkpKSAmPSB+KCh1bnNpZ25lZCBpbnQpV09SRF9TV0FQKGJpdHMpKSkxICovCisjZGVmaW5lIEdUX1JFU0VUX1JFR19CSVRTKHJlZ09mZnNldCxiaXRzKSBSRVNFVF9SRUdfQklUUyhyZWdPZmZzZXQsYml0cykKKworCisjZGVmaW5lIERFQlVHX0xFRDBfT04oKQkgICAgICAgV1JJVEVfQ0hBUihtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyhERVZJQ0UxKSB8IDB4ODAwMCwwKQorI2RlZmluZSBERUJVR19MRUQxX09OKCkJICAgICAgIFdSSVRFX0NIQVIobWVtb3J5R2V0RGV2aWNlQmFzZUFkZHJlc3MoREVWSUNFMSkgfCAweGMwMDAsMCkKKyNkZWZpbmUgREVCVUdfTEVEMl9PTigpCSAgICAgICBXUklURV9DSEFSKG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzKERFVklDRTEpIHwgMHgxMDAwMCwwKQorI2RlZmluZSBERUJVR19MRUQwX09GRigpICAgICAgV1JJVEVfQ0hBUihtZW1vcnlHZXREZXZpY2VCYXNlQWRkcmVzcyhERVZJQ0UxKSB8IDB4MTQwMDAsMCkKKyNkZWZpbmUgREVCVUdfTEVEMV9PRkYoKSAgICAgIFdSSVRFX0NIQVIobWVtb3J5R2V0RGV2aWNlQmFzZUFkZHJlc3MoREVWSUNFMSkgfCAweDE4MDAwLDApCisjZGVmaW5lIERFQlVHX0xFRDJfT0ZGKCkgICAgICBXUklURV9DSEFSKG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzKERFVklDRTEpIHwgMHgxYzAwMCwwKQorCisjZW5kaWYgLyogX19JTkNjb3JlaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9pbmNsdWRlL21lbW9yeS5oIGIvYm9hcmQvTWFydmVsbC9pbmNsdWRlL21lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDdiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvbWVtb3J5LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIE1lbW9yeS5oIC0gTWVtb3J5IG1hcHBpbmdzIGFuZCByZW1hcHBpbmcgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyAqLworCisvKiBDb3B5cmlnaHQgLSBHYWxpbGVvIHRlY2hub2xvZ3kuICovCisKKyNpZm5kZWYgX19JTkNtZW1vcnloCisjZGVmaW5lIF9fSU5DbWVtb3J5aAorCisvKiBpbmNsdWRlcyAqLworCisjaW5jbHVkZSAiY29yZS5oIgorCisvKiBkZWZpbmVzICovCisKKyNkZWZpbmUgRE9OVF9NT0RJRlkJMHhmZmZmZmZmZgorI2RlZmluZSBQQVJJVFlfU1VQUE9SVAkweDQwMDAwMDAwCisjZGVmaW5lIE1JTklNVU1fTUVNX0JBTktfU0laRQkJMHgxMDAwMAorI2RlZmluZSBNSU5JTVVNX0RFVklDRV9XSU5ET1dfU0laRQkweDEwMDAwCisjZGVmaW5lIE1JTklNVU1fUENJX1dJTkRPV19TSVpFCQkweDEwMDAwCisjZGVmaW5lIE1JTklNVU1fQUNDRVNTX1dJTl9TSVpFCQkweDEwMDAwCisKKyNkZWZpbmUgXzhCSVQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgXzE2QklUCQkweDAwMTAwMDAwCisjZGVmaW5lIF8zMkJJVAkJMHgwMDIwMDAwMAorI2RlZmluZSBfNjRCSVQJCTB4MDAzMDAwMDAKKworLyogdHlwZWRlZnMgKi8KKworIHR5cGVkZWYgc3RydWN0IGRldmljZVBhcmFtCit7CQkJCQkJLyogYm91bmRhcnkgdmFsdWVzICAqLworICAgIHVuc2lnbmVkIGludCAgICB0dXJuT2ZmOwkJCS8qIDB4MCAtIDB4ZgkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgYWNjMkZpcnN0OwkJCS8qIDB4MCAtIDB4MWYJICAgICovCisgICAgdW5zaWduZWQgaW50ICAgIGFjYzJOZXh0OwkJLyogMHgwIC0gMHgxZgkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgYWxlMldyOwkJCS8qIDB4MCAtIDB4ZgkgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgICAgd3JMb3c7CQkJLyogMHgwIC0gMHhmCSAgICAqLworICAgIHVuc2lnbmVkIGludCAgICB3ckhpZ2g7CQkJLyogMHgwIC0gMHhmCSAgICAqLworICAgIHVuc2lnbmVkIGludCAgICBiYWRyU2tldzsJCS8qIDB4MCAtIDB4MgkgICAqLworICAgIHVuc2lnbmVkIGludCAgICBEUEVuOwkJCS8qIDB4MCAtIDB4MQkgICAqLworICAgIHVuc2lnbmVkIGludCAgICBkZXZpY2VXaWR0aDsJLyogaW4gQnl0ZXMgICovCit9IERFVklDRV9QQVJBTTsKKworCit0eXBlZGVmIGVudW0gX19tZW1CYW5re0JBTkswLEJBTksxLEJBTksyLEJBTkszfSBNRU1PUllfQkFOSzsKK3R5cGVkZWYgZW51bSBfX21lbURldmljZXtERVZJQ0UwLERFVklDRTEsREVWSUNFMixERVZJQ0UzLEJPT1RfREVWSUNFfSBERVZJQ0U7CisKKy8qdHlwZWRlZiBlbnVtIF9fbWVtb3J5UHJvdGVjdFJlZ2lvbntNRU1fUkVHSU9OMCxNRU1fUkVHSU9OMSxNRU1fUkVHSU9OMiwJXAorCQkJCSAgIE1FTV9SRUdJT04zLE1FTV9SRUdJT040LE1FTV9SRUdJT041LAkgICAgICBcCisJCQkJICAgTUVNX1JFR0lPTjYsTUVNX1JFR0lPTjd9CQkgICAgICBcCisJCQkJICAgTUVNT1JZX1BST1RFQ1RfUkVHSU9OOyovCisvKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSB3aW5kb3dzIHRoYXQgY2FuIGJlIGRlZmluZWQgYXMgcHJvdGVjdGVkICovCit0eXBlZGVmIGVudW0gX21lbW9yeVByb3RlY3RXaW5kb3d7TUVNX1dJTkRPVzAsTUVNX1dJTkRPVzEsTUVNX1dJTkRPVzIsCisJCQkJICBNRU1fV0lORE9XMworCQkJCSB9IE1FTU9SWV9QUk9URUNUX1dJTkRPVzsKKy8qIFdoZW4gZGVmaW5pbmcgYSBwcm90ZWN0ZWQgd2luZG93ICwgdGhpcyBwYXJhbXRlciBpbmRpY2F0ZXMgd2hldGhlciBpdAorICAgaXMgYWNjZXNzaWJsZSBvciBub3QgKi8KK3R5cGVkZWYgZW51bSBfX21lbW9yeUFjY2Vzc3tNRU1fQUNDRVNTX0FMTE9XRUQsTUVNX0FDQ0VTU19GT1JCSURFTn0JICAgICAgXAorCQkJICAgIE1FTU9SWV9BQ0NFU1M7Cit0eXBlZGVmIGVudW0gX19tZW1vcnlXcml0ZXtNRU1fV1JJVEVfQUxMT1dFRCxNRU1fV1JJVEVfRk9SQklERU59CSAgICAgIFwKKwkJCSAgIE1FTU9SWV9BQ0NFU1NfV1JJVEU7Cit0eXBlZGVmIGVudW0gX19tZW1vcnlDYWNoZVByb3RlY3R7TUVNX0NBQ0hFX0FMTE9XRUQsTUVNX0NBQ0hFX0ZPUkJJREVOfQkgICAgICBcCisJCQkJICBNRU1PUllfQ0FDSEVfUFJPVEVDVDsKK3R5cGVkZWYgZW51bSBfX21lbW9yeVNub29wVHlwZXtNRU1fTk9fU05PT1AsTUVNX1NOT09QX1dULE1FTV9TTk9PUF9XQn0JICAgICAgXAorCQkJICAgICAgIE1FTU9SWV9TTk9PUF9UWVBFOwordHlwZWRlZiBlbnVtIF9fbWVtb3J5U25vb3BSZWdpb257TUVNX1NOT09QX1JFR0lPTjAsTUVNX1NOT09QX1JFR0lPTjEsCSAgICAgIFwKKwkJCQkgTUVNX1NOT09QX1JFR0lPTjIsTUVNX1NOT09QX1JFR0lPTjN9CSAgICAgIFwKKwkJCQkgTUVNT1JZX1NOT09QX1JFR0lPTjsKKworLyogVGhlcmUgYXJlIDIxIG1lbW9yeSB3aW5kb3dzIGRlZGljYXRlZCBmb3IgdGhlIHZhcmlvcyBpbnRlcmZhY2VzIChQQ0ksCisgICBkZXZDUyAoZGV2aWNlcyksIENTKEREUiksIGludGVyZW5hbCByZWdpc3RlcnMgYW5kIFNSQU0pIHVzZWQgYnkgdGhlIENQVSdzCisgICBhZGRyZXNzIGRlY29kaW5nIG1lY2hhbmlzbS4gKi8KK3R5cGVkZWYgZW51bSBfbWVtb3J5V2luZG93IHtDU18wX1dJTkRPVyA9IEJJVDAsIENTXzFfV0lORE9XID0gQklUMSwKKwkJCSAgICBDU18yX1dJTkRPVyA9IEJJVDIsIENTXzNfV0lORE9XID0gQklUMywKKwkJCSAgICBERVZDU18wX1dJTkRPVyA9IEJJVDQsIERFVkNTXzFfV0lORE9XID0gQklUNSwKKwkJCSAgICBERVZDU18yX1dJTkRPVyA9IEJJVDYsIERFVkNTXzNfV0lORE9XID0gQklUNywKKwkJCSAgICBCT09UX0NTX1dJTkRPVyA9IEJJVDgsIFBDSV8wX0lPX1dJTkRPVyA9IEJJVDksCisJCQkgICAgUENJXzBfTUVNMF9XSU5ET1cgPSBCSVQxMCwKKwkJCSAgICBQQ0lfMF9NRU0xX1dJTkRPVyA9IEJJVDExLAorCQkJICAgIFBDSV8wX01FTTJfV0lORE9XID0gQklUMTIsCisJCQkgICAgUENJXzBfTUVNM19XSU5ET1cgPSBCSVQxMywgUENJXzFfSU9fV0lORE9XID0gQklUMTQsCisJCQkgICAgUENJXzFfTUVNMF9XSU5ET1cgPSBCSVQxNSwgUENJXzFfTUVNMV9XSU5ET1cgPUJJVDE2LAorCQkJICAgIFBDSV8xX01FTTJfV0lORE9XID0gQklUMTcsIFBDSV8xX01FTTNfV0lORE9XID1CSVQxOCwKKwkJCSAgICBJTlRFR1JBVEVEX1NSQU1fV0lORE9XID0gQklUMTksCisJCQkgICAgSU5URVJOQUxfU1BBQ0VfV0lORE9XID0gQklUMjAsCisJCQkgICAgQUxMX1dJTkRPV1MgPSAwWDFGRkZGRgorCQkJICAgfSBNRU1PUllfV0lORE9XOworCit0eXBlZGVmIGVudW0gX21lbW9yeVdpbmRvd1N0YXR1cyB7TUVNX1dJTkRPV19FTkFCTEVELE1FTV9XSU5ET1dfRElTQUJMRUQKKwkJCQkgfSBNRU1PUllfV0lORE9XX1NUQVRVUzsKKworCit0eXBlZGVmIGVudW0gX3BjaU1lbVdpbmRvd3tQQ0lfMF9JTyxQQ0lfMF9NRU0wLFBDSV8wX01FTTEsUENJXzBfTUVNMixQQ0lfMF9NRU0zCisjaWZkZWYgSU5DTFVERV9QQ0lfMQorCQkJICAsUENJXzFfSU8sUENJXzFfTUVNMCxQQ0lfMV9NRU0xLFBDSV8xX01FTTIsUENJXzFfTUVNMworI2VuZGlmIC8qIElOQ0xVREVfUENJXzEgKi8KKwkJCSAgfSBQQ0lfTUVNX1dJTkRPVzsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogZnVuY3Rpb25zICovCit1bnNpZ25lZCBpbnQgbWVtb3J5R2V0QmFua0Jhc2VBZGRyZXNzKE1FTU9SWV9CQU5LIGJhbmspOwordW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZUJhc2VBZGRyZXNzKERFVklDRSBkZXZpY2UpOworLyogTmV3IGF0IE1WNjQzNnggKi8KK3Vuc2lnbmVkIGludCBNZW1vcnlHZXRQY2lCYXNlQWRkcihQQ0lfTUVNX1dJTkRPVyBwY2lXaW5kb3cpOwordW5zaWduZWQgaW50IG1lbW9yeUdldEJhbmtTaXplKE1FTU9SWV9CQU5LIGJhbmspOwordW5zaWduZWQgaW50IG1lbW9yeUdldERldmljZVNpemUoREVWSUNFIGRldmljZSk7Cit1bnNpZ25lZCBpbnQgbWVtb3J5R2V0RGV2aWNlV2lkdGgoREVWSUNFIGRldmljZSk7CisvKiBOZXcgYXQgTVY2NDM2eCAqLwordW5zaWduZWQgaW50IGd0TWVtb3J5R2V0UGNpV2luZG93U2l6ZShQQ0lfTUVNX1dJTkRPVyBwY2lXaW5kb3cpOworCisvKiB3aGVuIGdpdmVuIGJhc2UgQWRkcmVzcyBhbmQgc2l6ZSBTZXQgbmV3IFdJTkRPVyBmb3IgU0NTX1guIChYID0gMCwxLDIgb3IgMyovCitib29sIG1lbW9yeU1hcEJhbmsoTUVNT1JZX0JBTksgYmFuaywgdW5zaWduZWQgaW50IGJhbmtCYXNlLHVuc2lnbmVkIGludCBiYW5rTGVuZ3RoKTsKKy8qIFNldCBhIG5ldyBiYXNlIGFuZCBzaXplIGZvciBvbmUgb2YgdGhlIG1lbW9yeSBiYW5rcyAoQ1MwIC0gQ1MzKSAqLworYm9vbCBndE1lbW9yeVNldE1lbW9yeUJhbmsoTUVNT1JZX0JBTksgYmFuaywgdW5zaWduZWQgaW50IGJhbmtCYXNlLAorCQkJICAgdW5zaWduZWQgaW50IGJhbmtTaXplKTsKK2Jvb2wgbWVtb3J5TWFwRGV2aWNlU3BhY2UoREVWSUNFIGRldmljZSwgdW5zaWduZWQgaW50IGRldmljZUJhc2UsdW5zaWduZWQgaW50IGRldmljZUxlbmd0aCk7CisKKy8qIENoYW5nZSB0aGUgSW50ZXJuYWwgUmVnaXN0ZXIgQmFzZSBBZGRyZXNzIHRvIGEgbmV3IGdpdmVuIEFkZHJlc3MuICovCitib29sIG1lbW9yeU1hcEludGVybmFsUmVnaXN0ZXJzU3BhY2UodW5zaWduZWQgaW50IGludGVybmFsUmVnQmFzZSk7CisvKiByZXR1cm5zIGludGVybmFsIFJlZ2lzdGVyIFNwYWNlIEJhc2UgQWRkcmVzcy4gKi8KK3Vuc2lnbmVkIGludCBtZW1vcnlHZXRJbnRlcm5hbFJlZ2lzdGVyc1NwYWNlKHZvaWQpOworCisvKiBSZXR1cm5zIHRoZSBpbnRlZ3JhdGVkIFNSQU0gQmFzZSBBZGRyZXNzLiAqLwordW5zaWduZWQgaW50IG1lbW9yeUdldEludGVybmFsU3JhbUJhc2VBZGRyKHZvaWQpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNldCBuZXcgYmFzZSBhZGRyZXNzIGZvciB0aGUgaW50ZWdyYXRlZCBTUkFNLiAqLwordm9pZCBtZW1vcnlTZXRJbnRlcm5hbFNyYW1CYXNlQWRkcih1bnNpZ25lZCBpbnQgc3JhbUJhc2VBZGRyZXNzKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBEZWxldGUgYSBwcm90ZWN0aW9uIGZlYXR1cmUgdG8gYSBnaXZlbiBzcGFjZS4gKi8KK3ZvaWQgbWVtb3J5RGlzYWJsZVByb3RlY3RSZWdpb24oTUVNT1JZX1BST1RFQ1RfV0lORE9XIHdpbmRvdyk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogV3JpdGVzIGEgbmV3IHJlbWFwIHZhbHVlIHRvIHRoZSByZW1hcCByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1lbW9yeVNldFBjaVJlbWFwVmFsdWUoUENJX01FTV9XSU5ET1cgbWVtb3J5V2luZG93LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCByZW1hcFZhbHVlSGlnaCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgcmVtYXBWYWx1ZUxvdyk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ29uZmlndXJhdGUgdGhlIHByb3RlY3Rpb24gZmVhdHVyZSB0byBhIGdpdmVuIHNwYWNlLiAqLworYm9vbCBtZW1vcnlTZXRQcm90ZWN0UmVnaW9uKE1FTU9SWV9QUk9URUNUX1dJTkRPVyB3aW5kb3csCisJCQkgICAgICBNRU1PUllfQUNDRVNTIGd0TWVtb3J5QWNjZXNzLAorCQkJICAgICAgTUVNT1JZX0FDQ0VTU19XUklURSBndE1lbW9yeVdyaXRlLAorCQkJICAgICAgTUVNT1JZX0NBQ0hFX1BST1RFQ1QgY2FjaGVQcm90ZWN0aW9uLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJhc2VBZGRyZXNzLAorCQkJICAgICAgdW5zaWduZWQgaW50IHNpemUpOworCisvKiBDb25maWd1cmF0ZSB0aGUgcHJvdGVjdGlvbiBmZWF0dXJlIHRvIGEgZ2l2ZW4gc3BhY2UuICovCisvKmJvb2wgbWVtb3J5U2V0UHJvdGVjdFJlZ2lvbihNRU1PUllfUFJPVEVDVF9SRUdJT04gcmVnaW9uLAorCQkJICAgIE1FTU9SWV9BQ0NFU1MgbWVtb3J5QWNjZXNzLAorCQkJICAgIE1FTU9SWV9BQ0NFU1NfV1JJVEUgbWVtb3J5V3JpdGUsCisJCQkgICAgTUVNT1JZX0NBQ0hFX1BST1RFQ1QgY2FjaGVQcm90ZWN0aW9uLAorCQkJICAgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKTsgKi8KKy8qIENvbmZpZ3VyYXRlIHRoZSBzbm9vcCBmZWF0dXJlIHRvIGEgZ2l2ZW4gc3BhY2UuICovCitib29sIG1lbW9yeVNldFJlZ2lvblNub29wTW9kZShNRU1PUllfU05PT1BfUkVHSU9OIHJlZ2lvbiwKKwkJCSAgICAgIE1FTU9SWV9TTk9PUF9UWVBFIHNub29wVHlwZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKwkJCSAgICAgIHVuc2lnbmVkIGludCByZWdpb25MZW5ndGgpOworCitib29sIG1lbW9yeVJlbWFwQWRkcmVzcyh1bnNpZ25lZCBpbnQgcmVtYXBSZWcsIHVuc2lnbmVkIGludCByZW1hcFZhbHVlKTsKK2Jvb2wgbWVtb3J5R2V0RGV2aWNlUGFyYW0oREVWSUNFX1BBUkFNICpkZXZpY2VQYXJhbSwgREVWSUNFIGRldmljZU51bSk7Citib29sIG1lbW9yeVNldERldmljZVBhcmFtKERFVklDRV9QQVJBTSAqZGV2aWNlUGFyYW0sIERFVklDRSBkZXZpY2VOdW0pOworLyogU2V0IGEgbmV3IGJhc2UgYW5kIHNpemUgZm9yIG9uZSBvZiB0aGUgUENJIHdpbmRvd3MuICovCitib29sIG1lbW9yeVNldFBjaVdpbmRvdyhQQ0lfTUVNX1dJTkRPVyBwY2lXaW5kb3csIHVuc2lnbmVkIGludCBwY2lXaW5kb3dCYXNlLAorCQkJICB1bnNpZ25lZCBpbnQgcGNpV2luZG93U2l6ZSk7CisKKy8qIERpc2FibGUgb3IgZW5hYmxlIG9uZSBvZiB0aGUgMjEgd2luZG93cyBkZWRpY2F0ZWQgZm9yIHRoZSBDUFUncworICAgYWRkcmVzcyBkZWNvZGluZyBtZWNoYW5pc20gKi8KK3ZvaWQgTWVtb3J5RGlzYWJsZVdpbmRvdyhNRU1PUllfV0lORE9XIHdpbmRvdyk7Cit2b2lkIE1lbW9yeUVuYWJsZVdpbmRvdyAoTUVNT1JZX1dJTkRPVyB3aW5kb3cpOworTUVNT1JZX1dJTkRPV19TVEFUVVMgTWVtb3J5R2V0TWVtV2luZG93U3RhdHVzKE1FTU9SWV9XSU5ET1cgd2luZG93KTsKKyNlbmRpZgkvKiBfX0lOQ21lbW9yeWggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL01hcnZlbGwvaW5jbHVkZS9tdl9nZW5fcmVnLmggYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvbXZfZ2VuX3JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvbXZfZ2VuX3JlZy5oCkBAIC0wLDAgKzEsMjI4OCBAQAorLyogbXZfZ2VuX3JlZy5oIC0gSW50ZXJuYWwgcmVnaXN0ZXJzIGRlZmluaXRpb24gZmlsZSAqLworLyogQ29weXJpZ2h0IC0gR2FsaWxlbyB0ZWNobm9sb2d5LiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCQkgICAgQ29weXJpZ2h0IDIwMDIsIEdBTElMRU8gVEVDSE5PTE9HWSwgTFRELgkJICAgICAgICoKKyogVEhJUyBDT0RFIENPTlRBSU5TIENPTkZJREVOVElBTCBJTkZPUk1BVElPTiBPRiBNQVJWRUxMLgkJICAgICAgICoKKyogTk8gUklHSFRTIEFSRSBHUkFOVEVEIEhFUkVJTiBVTkRFUiBBTlkgUEFURU5ULCBNQVNLIFdPUksgUklHSFQgT1IgQ09QWVJJR0hUICAqCisqIE9GIE1BUlZFTEwgT1IgQU5ZIFRISVJEIFBBUlRZLiBNQVJWRUxMIFJFU0VSVkVTIFRIRSBSSUdIVCBBVCBJVFMgU09MRQkgICAgICAgKgorKiBESVNDUkVUSU9OIFRPIFJFUVVFU1QgVEhBVCBUSElTIENPREUgQkUgSU1NRURJQVRFTFkgUkVUVVJORUQgVE8gTUFSVkVMTC4gICAgICoKKyogVEhJUyBDT0RFIElTIFBST1ZJREVEICJBUyBJUyIuIE1BUlZFTEwgTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTU0VELCAgICAgICAqCisqIElNUExJRUQgT1IgT1RIRVJXSVNFLCBSRUdBUkRJTkcgSVRTIEFDQ1VSQUNZLCBDT01QTEVURU5FU1MgT1IgUEVSRk9STUFOQ0UuICAgKgorKgkJCQkJCQkJCSAgICAgICAqCisqIE1BUlZFTEwgQ09NUFJJU0VTIE1BUlZFTEwgVEVDSE5PTE9HWSBHUk9VUCBMVEQuIChNVEdMKSBBTkQgSVRTIFNVQlNJRElBUklFUywgKgorKiBNQVJWRUxMIElOVEVSTkFUSU9OQUwgTFRELiAoTUlMKSwgTUFSVkVMTCBURUNITk9MT0dZLCBJTkMuIChNVEkpLCBNQVJWRUxMICAgICoKKyogU0VNSUNPTkRVQ1RPUiwgSU5DLiAoTVNJKSwgTUFSVkVMTCBBU0lBIFBURSBMVEQuIChNQVBMKSwgTUFSVkVMTCBKQVBBTiBLLksuICAqCisqIChNSktLKSwgR0FMSUxFTyBURUNITk9MT0dZIExURC4gKEdUTCkgQU5EIEdBTElMRU8gVEVDSE5PTE9HWSwgSU5DLiAoR1RJKS4gICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfZ2VuX3JlZy5oIC0gTWFydmVsbCA2NDM2MCBhbmQgNjQ0NjAgSW50ZXJuYWwgcmVnaXN0ZXJzIGRlZmluaXRpb24gZmlsZS4KKyoKKyogREVTQ1JJUFRJT046CisqCU5vbmUuCisqCisqIERFUEVOREVOQ0lFUzoKKyoJTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNtdl9nZW5fcmVnaAorI2RlZmluZSBfX0lOQ212X2dlbl9yZWdoCisKKworLyogU3VwcG9ydGVkIGJ5IHRoZSBBdGxhbnRpcyAqLworI2RlZmluZSBJTkNMVURFX1BDSV8xCisjZGVmaW5lIElOQ0xVREVfUENJXzBfQVJCSVRFUgorI2RlZmluZSBJTkNMVURFX1BDSV8xX0FSQklURVIKKyNkZWZpbmUgSU5DTFVERV9TTk9PUF9TVVBQT1JUCisjZGVmaW5lIElOQ0xVREVfUDJQCisjZGVmaW5lIElOQ0xVREVfRVRIX1BPUlRfMgorI2RlZmluZSBJTkNMVURFX0NQVV9NQVBQSU5HCisjZGVmaW5lIElOQ0xVREVfTVBTQworCisvKiBOb3Qgc3VwcG9ydGVkIGZlYXR1cmVzICovCisjdW5kZWYJSU5DTFVERV9DTlRNUl80XzcKKyN1bmRlZglJTkNMVURFX0RNQV80XzcKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByb2Nlc3NvciBBZGRyZXNzIFNwYWNlCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEREUiBTRFJBTSBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzICovCisKKy8qIFNkcmFtJ3MgQkFSJ1MgKi8KKyNkZWZpbmUgU0NTXzBfTE9XX0RFQ09ERV9BRERSRVNTCQkJMHgwMDgKKyNkZWZpbmUgU0NTXzBfSElHSF9ERUNPREVfQUREUkVTUwkJCTB4MDEwCisjZGVmaW5lIFNDU18xX0xPV19ERUNPREVfQUREUkVTUwkJCTB4MjA4CisjZGVmaW5lIFNDU18xX0hJR0hfREVDT0RFX0FERFJFU1MJCQkweDIxMAorI2RlZmluZSBTQ1NfMl9MT1dfREVDT0RFX0FERFJFU1MJCQkweDAxOAorI2RlZmluZSBTQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTCQkJMHgwMjAKKyNkZWZpbmUgU0NTXzNfTE9XX0RFQ09ERV9BRERSRVNTCQkJMHgyMTgKKyNkZWZpbmUgU0NTXzNfSElHSF9ERUNPREVfQUREUkVTUwkJCTB4MjIwCisKKy8qIE1ha2UgaXQgZml0IHRoZSBNVjY0MzYwIGFuZCBNVjY0NDYwIExvd2xldmVsIGRyaXZlciAqLworI2RlZmluZSBDU18wX0JBU0VfQUREUgkJCVNDU18wX0xPV19ERUNPREVfQUREUkVTUworI2RlZmluZSBDU18wX1NJWkUJCQlTQ1NfMF9ISUdIX0RFQ09ERV9BRERSRVNTCisjZGVmaW5lIENTXzFfQkFTRV9BRERSCQlTQ1NfMV9MT1dfREVDT0RFX0FERFJFU1MKKyNkZWZpbmUgQ1NfMV9TSVpFCQkJU0NTXzFfSElHSF9ERUNPREVfQUREUkVTUworI2RlZmluZSBDU18yX0JBU0VfQUREUgkJU0NTXzJfTE9XX0RFQ09ERV9BRERSRVNTCisjZGVmaW5lIENTXzJfU0laRQkJCVNDU18yX0hJR0hfREVDT0RFX0FERFJFU1MKKyNkZWZpbmUgQ1NfM19CQVNFX0FERFIJCVNDU18zX0xPV19ERUNPREVfQUREUkVTUworI2RlZmluZSBDU18zX1NJWkUJCQlTQ1NfM19ISUdIX0RFQ09ERV9BRERSRVNTCisKKy8qIERldmljZXMgQkFSJ1MgKi8KKyNkZWZpbmUgQ1NfMF9MT1dfREVDT0RFX0FERFJFU1MJCQkweDAyOAorI2RlZmluZSBDU18wX0hJR0hfREVDT0RFX0FERFJFU1MJCQkweDAzMAorI2RlZmluZSBDU18xX0xPV19ERUNPREVfQUREUkVTUwkJCTB4MjI4CisjZGVmaW5lIENTXzFfSElHSF9ERUNPREVfQUREUkVTUwkJCTB4MjMwCisjZGVmaW5lIENTXzJfTE9XX0RFQ09ERV9BRERSRVNTCQkJMHgyNDgKKyNkZWZpbmUgQ1NfMl9ISUdIX0RFQ09ERV9BRERSRVNTCQkJMHgyNTAKKyNkZWZpbmUgQ1NfM19MT1dfREVDT0RFX0FERFJFU1MJCQkweDAzOAorI2RlZmluZSBDU18zX0hJR0hfREVDT0RFX0FERFJFU1MJCQkweDA0MAorI2RlZmluZSBCT09UQ1NfTE9XX0RFQ09ERV9BRERSRVNTCQkJMHgyMzgKKyNkZWZpbmUgQk9PVENTX0hJR0hfREVDT0RFX0FERFJFU1MJCQkweDI0MAorCisvKiBNYWtlIGl0IGZpdCB0aGUgTVY2NDM2MCBhbmQgTVY2NDQ2MCBMb3dsZXZlbCBkcml2ZXIgKi8KKy8qIERldmljZXMgQkFSIGFuZCBzaXplIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIERFVl9DUzBfQkFTRV9BRERSCUNTXzBfTE9XX0RFQ09ERV9BRERSRVNTCisjZGVmaW5lIERFVl9DUzBfU0laRQkJCUNTXzBfSElHSF9ERUNPREVfQUREUkVTUworI2RlZmluZSBERVZfQ1MxX0JBU0VfQUREUglDU18xX0xPV19ERUNPREVfQUREUkVTUworI2RlZmluZSBERVZfQ1MxX1NJWkUJCUNTXzFfSElHSF9ERUNPREVfQUREUkVTUworI2RlZmluZSBERVZfQ1MyX0JBU0VfQUREUglDU18yX0xPV19ERUNPREVfQUREUkVTUworI2RlZmluZSBERVZfQ1MyX1NJWkUJCQlDU18yX0hJR0hfREVDT0RFX0FERFJFU1MKKyNkZWZpbmUgREVWX0NTM19CQVNFX0FERFIJCUNTXzNfTE9XX0RFQ09ERV9BRERSRVNTCisjZGVmaW5lIERFVl9DUzNfU0laRQkJQ1NfM19ISUdIX0RFQ09ERV9BRERSRVNTCisjZGVmaW5lIEJPT1RDU19CQVNFX0FERFIJQk9PVENTX0xPV19ERUNPREVfQUREUkVTUworI2RlZmluZSBCT09UQ1NfU0laRQkJQk9PVENTX0hJR0hfREVDT0RFX0FERFJFU1MKKworLyogUENJIDAgQkFSIGFuZCBzaXplIHJlZ2lzdGVycwkgb2xkIG5hbWVzIG9mIGV2YjY0MjYwKi8KKworI2RlZmluZSBQQ0lfMElfT19MT1dfREVDT0RFX0FERFJFU1MJCQkweDA0OAorI2RlZmluZSBQQ0lfMElfT19ISUdIX0RFQ09ERV9BRERSRVNTCQkJMHgwNTAKKyNkZWZpbmUgUENJXzBNRU1PUlkwX0xPV19ERUNPREVfQUREUkVTUwkJMHgwNTgKKyNkZWZpbmUgUENJXzBNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1MJCTB4MDYwCisjZGVmaW5lIFBDSV8wTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1MJCTB4MDgwCisjZGVmaW5lIFBDSV8wTUVNT1JZMV9ISUdIX0RFQ09ERV9BRERSRVNTCQkweDA4OAorI2RlZmluZSBQQ0lfME1FTU9SWTJfTE9XX0RFQ09ERV9BRERSRVNTCQkweDI1OAorI2RlZmluZSBQQ0lfME1FTU9SWTJfSElHSF9ERUNPREVfQUREUkVTUwkJMHgyNjAKKyNkZWZpbmUgUENJXzBNRU1PUlkzX0xPV19ERUNPREVfQUREUkVTUwkJMHgyODAKKyNkZWZpbmUgUENJXzBNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1MJCTB4Mjg4CisKKy8qIE1ha2UgaXQgZml0IHRoZSBNVjY0MzYwIGFuZCBNVjY0NDYwIExvd2xldmVsIGRyaXZlciAqLworI2RlZmluZSBQQ0lfMF9JT19CQVNFX0FERFIJCQkJCQkweDA0OAorI2RlZmluZSBQQ0lfMF9JT19TSVpFCQkJCQkJCTB4MDUwCisjZGVmaW5lIFBDSV8wX01FTU9SWTBfQkFTRV9BRERSCQkJCQkweDA1OAorI2RlZmluZSBQQ0lfMF9NRU1PUlkwX1NJWkUJCQkJCQkweDA2MAorI2RlZmluZSBQQ0lfMF9NRU1PUlkxX0JBU0VfQUREUgkJCQkJMHgwODAKKyNkZWZpbmUgUENJXzBfTUVNT1JZMV9TSVpFCQkJCQkJMHgwODgKKyNkZWZpbmUgUENJXzBfTUVNT1JZMl9CQVNFX0FERFIJCQkJCTB4MjU4CisjZGVmaW5lIFBDSV8wX01FTU9SWTJfU0laRQkJCQkJCTB4MjYwCisjZGVmaW5lIFBDSV8wX01FTU9SWTNfQkFTRV9BRERSCQkJCQkweDI4MAorI2RlZmluZSBQQ0lfMF9NRU1PUlkzX1NJWkUJCQkJCQkweDI4OAorCisvKiBQQ0kgMSBCQVIgYW5kIHNpemUgcmVnaXN0ZXJzCSBvbGQgbmFtZXMgb2YgZXZiNjQyNjAqLworI2RlZmluZSBQQ0lfMUlfT19MT1dfREVDT0RFX0FERFJFU1MJCQkweDA5MAorI2RlZmluZSBQQ0lfMUlfT19ISUdIX0RFQ09ERV9BRERSRVNTCQkJMHgwOTgKKyNkZWZpbmUgUENJXzFNRU1PUlkwX0xPV19ERUNPREVfQUREUkVTUwkJMHgwYTAKKyNkZWZpbmUgUENJXzFNRU1PUlkwX0hJR0hfREVDT0RFX0FERFJFU1MJCTB4MGE4CisjZGVmaW5lIFBDSV8xTUVNT1JZMV9MT1dfREVDT0RFX0FERFJFU1MJCTB4MGIwCisjZGVmaW5lIFBDSV8xTUVNT1JZMV9ISUdIX0RFQ09ERV9BRERSRVNTCQkweDBiOAorI2RlZmluZSBQQ0lfMU1FTU9SWTJfTE9XX0RFQ09ERV9BRERSRVNTCQkweDJhMAorI2RlZmluZSBQQ0lfMU1FTU9SWTJfSElHSF9ERUNPREVfQUREUkVTUwkJMHgyYTgKKyNkZWZpbmUgUENJXzFNRU1PUlkzX0xPV19ERUNPREVfQUREUkVTUwkJMHgyYjAKKyNkZWZpbmUgUENJXzFNRU1PUlkzX0hJR0hfREVDT0RFX0FERFJFU1MJCTB4MmI4CisKKy8qIE1ha2UgaXQgZml0IHRoZSBNVjY0MzYwIGFuZCBNVjY0NDYwIExvd2xldmVsIGRyaXZlciAqLworI2RlZmluZSBQQ0lfMV9JT19CQVNFX0FERFIJCQkJCQkweDA5MAorI2RlZmluZSBQQ0lfMV9JT19TSVpFCQkJCQkJCTB4MDk4CisjZGVmaW5lIFBDSV8xX01FTU9SWTBfQkFTRV9BRERSCQkJCQkweDBhMAorI2RlZmluZSBQQ0lfMV9NRU1PUlkwX1NJWkUJCQkJCQkweDBhOAorI2RlZmluZSBQQ0lfMV9NRU1PUlkxX0JBU0VfQUREUgkJCQkJMHgwYjAKKyNkZWZpbmUgUENJXzFfTUVNT1JZMV9TSVpFCQkJCQkJMHgwYjgKKyNkZWZpbmUgUENJXzFfTUVNT1JZMl9CQVNFX0FERFIJCQkJCTB4MmEwCisjZGVmaW5lIFBDSV8xX01FTU9SWTJfU0laRQkJCQkJCTB4MmE4CisjZGVmaW5lIFBDSV8xX01FTU9SWTNfQkFTRV9BRERSCQkJCQkweDJiMAorI2RlZmluZSBQQ0lfMV9NRU1PUlkzX1NJWkUJCQkJCQkweDJiOAorCisvKiBpbnRlcm5hbCByZWdpc3RlcnMgc3BhY2UgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElOVEVSTkFMX1NQQUNFX0RFQ09ERQkJCQkweDA2OAorI2RlZmluZSBJTlRFUk5BTF9TUEFDRV9CQVNFX0FERFIJCQkJSU5URVJOQUxfU1BBQ0VfREVDT0RFCisKKy8qIFNSQU0gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElOVEVHUkFURURfU1JBTV9CQVNFX0FERFIJCQkJMHgyNjgKKworLyogRW5hYmxlcyB0aGUgQ1MgLCBERVZfQ1MgLCBQQ0kgMCBhbmQgUENJIDEKKyAgIHdpbmRvd3MgYWJvdmUgKi8KKyNkZWZpbmUgQkFTRV9BRERSX0VOQUJMRQkJCQkJCTB4Mjc4CisKKworI2RlZmluZSBDUFVfMF9MT1dfREVDT0RFX0FERFJFU1MJCQkJMHgyOTAKKyNkZWZpbmUgQ1BVXzBfSElHSF9ERUNPREVfQUREUkVTUwkJCQkweDI5OAorI2RlZmluZSBDUFVfMV9MT1dfREVDT0RFX0FERFJFU1MJCQkJMHgyYzAKKyNkZWZpbmUgQ1BVXzFfSElHSF9ERUNPREVfQUREUkVTUwkJCQkweDJjOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSByZW1hcCByZWdpc3RlcnMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAvKiBQQ0kgMCAqLworLyogb2xkIGZhc2hpb24gZXZiIDY0MjYwICovCisjZGVmaW5lIFBDSV8wSV9PX0FERFJFU1NfUkVNQVAJCQkJMHgwZjAKKyNkZWZpbmUgUENJXzBNRU1PUlkwX0FERFJFU1NfUkVNQVAJCQkweDBmOAorI2RlZmluZSBQQ0lfME1FTU9SWTBfSElHSF9BRERSRVNTX1JFTUFQCQkweDMyMAorI2RlZmluZSBQQ0lfME1FTU9SWTFfQUREUkVTU19SRU1BUAkJCTB4MTAwCisjZGVmaW5lIFBDSV8wTUVNT1JZMV9ISUdIX0FERFJFU1NfUkVNQVAJCTB4MzI4CisjZGVmaW5lIFBDSV8wTUVNT1JZMl9BRERSRVNTX1JFTUFQCQkJMHgyZjgKKyNkZWZpbmUgUENJXzBNRU1PUlkyX0hJR0hfQUREUkVTU19SRU1BUAkJMHgzMzAKKyNkZWZpbmUgUENJXzBNRU1PUlkzX0FERFJFU1NfUkVNQVAJCQkweDMwMAorI2RlZmluZSBQQ0lfME1FTU9SWTNfSElHSF9BRERSRVNTX1JFTUFQCQkweDMzOAorCisjZGVmaW5lIFBDSV8wX0lPX0FERFJfUkVNQVAJCQkJCQlQQ0lfMElfT19BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8wX01FTU9SWTBfTE9XX0FERFJfUkVNQVAJCQkJUENJXzBNRU1PUlkwX0FERFJFU1NfUkVNQVAKKyNkZWZpbmUgUENJXzBfTUVNT1JZMF9ISUdIX0FERFJfUkVNQVAJCQkJUENJXzBNRU1PUlkwX0hJR0hfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9NRU1PUlkxX0xPV19BRERSX1JFTUFQCQkJCVBDSV8wTUVNT1JZMV9BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8wX01FTU9SWTFfSElHSF9BRERSX1JFTUFQCQkJCVBDSV8wTUVNT1JZMV9ISUdIX0FERFJFU1NfUkVNQVAKKyNkZWZpbmUgUENJXzBfTUVNT1JZMl9MT1dfQUREUl9SRU1BUAkJCQlQQ0lfME1FTU9SWTJfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9NRU1PUlkyX0hJR0hfQUREUl9SRU1BUAkJCQlQQ0lfME1FTU9SWTJfSElHSF9BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8wX01FTU9SWTNfTE9XX0FERFJfUkVNQVAJCQkJUENJXzBNRU1PUlkzX0FERFJFU1NfUkVNQVAKKyNkZWZpbmUgUENJXzBfTUVNT1JZM19ISUdIX0FERFJfUkVNQVAJCQkJUENJXzBNRU1PUlkzX0hJR0hfQUREUkVTU19SRU1BUAorCisgICAgICAgLyogUENJIDEgKi8KKy8qIG9sZCBmYXNoaW9uIGV2YiA2NDI2MCAqLworI2RlZmluZSBQQ0lfMUlfT19BRERSRVNTX1JFTUFQCQkJCTB4MTA4CisjZGVmaW5lIFBDSV8xTUVNT1JZMF9BRERSRVNTX1JFTUFQCQkJMHgxMTAKKyNkZWZpbmUgUENJXzFNRU1PUlkwX0hJR0hfQUREUkVTU19SRU1BUAkJMHgzNDAKKyNkZWZpbmUgUENJXzFNRU1PUlkxX0FERFJFU1NfUkVNQVAJCQkweDExOAorI2RlZmluZSBQQ0lfMU1FTU9SWTFfSElHSF9BRERSRVNTX1JFTUFQCQkweDM0OAorI2RlZmluZSBQQ0lfMU1FTU9SWTJfQUREUkVTU19SRU1BUAkJCTB4MzEwCisjZGVmaW5lIFBDSV8xTUVNT1JZMl9ISUdIX0FERFJFU1NfUkVNQVAJCTB4MzUwCisjZGVmaW5lIFBDSV8xTUVNT1JZM19BRERSRVNTX1JFTUFQCQkJMHgzMTgKKyNkZWZpbmUgUENJXzFNRU1PUlkzX0hJR0hfQUREUkVTU19SRU1BUAkJMHgzNTgKKworI2RlZmluZSBQQ0lfMV9JT19BRERSX1JFTUFQCQkJCQkJUENJXzFJX09fQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9NRU1PUlkwX0xPV19BRERSX1JFTUFQCQkJCVBDSV8xTUVNT1JZMF9BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8xX01FTU9SWTBfSElHSF9BRERSX1JFTUFQCQkJCVBDSV8xTUVNT1JZMF9ISUdIX0FERFJFU1NfUkVNQVAKKyNkZWZpbmUgUENJXzFfTUVNT1JZMV9MT1dfQUREUl9SRU1BUAkJCQlQQ0lfMU1FTU9SWTFfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9NRU1PUlkxX0hJR0hfQUREUl9SRU1BUAkJCQlQQ0lfMU1FTU9SWTFfSElHSF9BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8xX01FTU9SWTJfTE9XX0FERFJfUkVNQVAJCQkJUENJXzFNRU1PUlkyX0FERFJFU1NfUkVNQVAKKyNkZWZpbmUgUENJXzFfTUVNT1JZMl9ISUdIX0FERFJfUkVNQVAJCQkJUENJXzFNRU1PUlkyX0hJR0hfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9NRU1PUlkzX0xPV19BRERSX1JFTUFQCQkJCVBDSV8xTUVNT1JZM19BRERSRVNTX1JFTUFQCisjZGVmaW5lIFBDSV8xX01FTU9SWTNfSElHSF9BRERSX1JFTUFQCQkJCVBDSV8xTUVNT1JZM19ISUdIX0FERFJFU1NfUkVNQVAKKworLyogb2xkIGZhc2hpb24gZXZiIDY0MjYwICovCisjZGVmaW5lIENQVV9QQ0lfMF9IRUFERVJTX1JFVEFSR0VUX0NPTlRST0wJCQkweDNiMAorI2RlZmluZSBDUFVfUENJXzBfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJCTB4M2I4CisjZGVmaW5lIENQVV9QQ0lfMV9IRUFERVJTX1JFVEFSR0VUX0NPTlRST0wJCQkweDNjMAorI2RlZmluZSBDUFVfUENJXzFfSEVBREVSU19SRVRBUkdFVF9CQVNFCQkJCTB4M2M4CisjZGVmaW5lIENQVV9HRV9IRUFERVJTX1JFVEFSR0VUX0NPTlRST0wJCQkJMHgzZDAKKyNkZWZpbmUgQ1BVX0dFX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCQkweDNkOAorCisvKiBNVjY0MzYwIGFuZCBNVjY0NDYwIG5vIGNoYW5nZXMgbmVlZGVkKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICBDUFUgQ29udHJvbCBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ1BVIE1BU1RFUiBDT05UUk9MIFJFR0lTVEVSICovCisjZGVmaW5lIENQVV9DT05GSUdVUkFUSU9OCQkJCTB4MDAwCisjZGVmaW5lIENQVV9NQVNURVJfQ09OVFJPTAkJCQkweDE2MAorCisjZGVmaW5lIENQVV9DT05GSUcJCQkJCQkJMHgwMDAKKyNkZWZpbmUgQ1BVX01PREUJCQkJCQkJMHgxMjAKKyNkZWZpbmUgQ1BVX01BU1RFUl9DT05UUk9MCQkJCQkJMHgxNjAKKy8qIG5ldyBpbiBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisjZGVmaW5lIENQVV9DUk9TU19CQVJfQ09OVFJPTF9MT1cJCQkJMHgxNTAKKyNkZWZpbmUgQ1BVX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCQkJMHgxNTgKKyNkZWZpbmUgQ1BVX0NST1NTX0JBUl9USU1FT1VUCQkJCQkweDE2OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNNUCBSZWdpc3RlclMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU01QX1dIT19BTV9JCQkJCQkJCTB4MjAwCisjZGVmaW5lIFNNUF9DUFUwX0RPT1JCRUxMCQkJCQkJMHgyMTQKKyNkZWZpbmUgU01QX0NQVTBfRE9PUkJFTExfQ0xFQVIJCQkJCTB4MjFDCisjZGVmaW5lIFNNUF9DUFUxX0RPT1JCRUxMCQkJCQkJMHgyMjQKKyNkZWZpbmUgU01QX0NQVTFfRE9PUkJFTExfQ0xFQVIJCQkJCTB4MjJDCisjZGVmaW5lIFNNUF9DUFUwX0RPT1JCRUxMX01BU0sJCQkJCTB4MjM0CisjZGVmaW5lIFNNUF9DUFUxX0RPT1JCRUxMX01BU0sJCQkJCTB4MjNDCisjZGVmaW5lIFNNUF9TRU1BUEhPUjAJCQkJCQkJMHgyNDQKKyNkZWZpbmUgU01QX1NFTUFQSE9SMQkJCQkJCQkweDI0YworI2RlZmluZSBTTVBfU0VNQVBIT1IyCQkJCQkJCTB4MjU0CisjZGVmaW5lIFNNUF9TRU1BUEhPUjMJCQkJCQkJMHgyNWMKKyNkZWZpbmUgU01QX1NFTUFQSE9SNAkJCQkJCQkweDI2NAorI2RlZmluZSBTTVBfU0VNQVBIT1I1CQkJCQkJCTB4MjZjCisjZGVmaW5lIFNNUF9TRU1BUEhPUjYJCQkJCQkJMHgyNzQKKyNkZWZpbmUgU01QX1NFTUFQSE9SNwkJCQkJCQkweDI3YworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ1BVIFN5bmMgQmFycmllcgkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENQVV8wX1NZTkNfQkFSUklFUl9UUklHR0VSCQkJCTB4MGMwCisjZGVmaW5lIENQVV8wX1NZTkNfQkFSUklFUl9WSVJUVUFMCQkJCTB4MGM4CisjZGVmaW5lIENQVV8xX1NZTkNfQkFSUklFUl9UUklHR0VSCQkJCTB4MGQwCisjZGVmaW5lIENQVV8xX1NZTkNfQkFSUklFUl9WSVJUVUFMCQkJCTB4MGQ4CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDUFUgQWNjZXNzIFByb3RlY3QJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1BVX0xPV19QUk9URUNUX0FERFJFU1NfMAkJCSAgICAweDE4MAorI2RlZmluZSBDUFVfSElHSF9QUk9URUNUX0FERFJFU1NfMAkJCSAgICAweDE4OAorI2RlZmluZSBDUFVfTE9XX1BST1RFQ1RfQUREUkVTU18xCQkJICAgIDB4MTkwCisjZGVmaW5lIENQVV9ISUdIX1BST1RFQ1RfQUREUkVTU18xCQkJICAgIDB4MTk4CisjZGVmaW5lIENQVV9MT1dfUFJPVEVDVF9BRERSRVNTXzIJCQkgICAgMHgxYTAKKyNkZWZpbmUgQ1BVX0hJR0hfUFJPVEVDVF9BRERSRVNTXzIJCQkgICAgMHgxYTgKKyNkZWZpbmUgQ1BVX0xPV19QUk9URUNUX0FERFJFU1NfMwkJCSAgICAweDFiMAorI2RlZmluZSBDUFVfSElHSF9QUk9URUNUX0FERFJFU1NfMwkJCSAgICAweDFiOAorLyojZGVmaW5lIENQVV9MT1dfUFJPVEVDVF9BRERSRVNTXzQJCQkgICAgICAweDFjMAorI2RlZmluZSBDUFVfSElHSF9QUk9URUNUX0FERFJFU1NfNAkJCSAgICAweDFjOAorI2RlZmluZSBDUFVfTE9XX1BST1RFQ1RfQUREUkVTU181CQkJICAgIDB4MWQwCisjZGVmaW5lIENQVV9ISUdIX1BST1RFQ1RfQUREUkVTU181CQkJICAgIDB4MWQ4CisjZGVmaW5lIENQVV9MT1dfUFJPVEVDVF9BRERSRVNTXzYJCQkgICAgMHgxZTAKKyNkZWZpbmUgQ1BVX0hJR0hfUFJPVEVDVF9BRERSRVNTXzYJCQkgICAgMHgxZTgKKyNkZWZpbmUgQ1BVX0xPV19QUk9URUNUX0FERFJFU1NfNwkJCSAgICAweDFmMAorI2RlZmluZSBDUFVfSElHSF9QUk9URUNUX0FERFJFU1NfNwkJCSAgICAweDFmOAorKi8KKworI2RlZmluZSBDUFVfUFJPVEVDVF9XSU5ET1dfMF9CQVNFX0FERFIJCSAgICAgQ1BVX0xPV19QUk9URUNUX0FERFJFU1NfMCAvKiAweDE4MCAqLworI2RlZmluZSBDUFVfUFJPVEVDVF9XSU5ET1dfMF9TSVpFCQkJICAgIENQVV9ISUdIX1BST1RFQ1RfQUREUkVTU18wIC8qIDB4MTg4ICovCisjZGVmaW5lIENQVV9QUk9URUNUX1dJTkRPV18xX0JBU0VfQUREUgkJICAgICBDUFVfTE9XX1BST1RFQ1RfQUREUkVTU18xIC8qIDB4MTkwICovCisjZGVmaW5lIENQVV9QUk9URUNUX1dJTkRPV18xX1NJWkUJCQkgICAgQ1BVX0hJR0hfUFJPVEVDVF9BRERSRVNTXzEgLyogMHgxOTggKi8KKyNkZWZpbmUgQ1BVX1BST1RFQ1RfV0lORE9XXzJfQkFTRV9BRERSCQkgICAgIENQVV9MT1dfUFJPVEVDVF9BRERSRVNTXzIgLyoweDFhMCAqLworI2RlZmluZSBDUFVfUFJPVEVDVF9XSU5ET1dfMl9TSVpFCQkJICAgIENQVV9ISUdIX1BST1RFQ1RfQUREUkVTU18yIC8qIDB4MWE4ICovCisjZGVmaW5lIENQVV9QUk9URUNUX1dJTkRPV18zX0JBU0VfQUREUgkJICAgICBDUFVfTE9XX1BST1RFQ1RfQUREUkVTU18zIC8qIDB4MWIwICovCisjZGVmaW5lIENQVV9QUk9URUNUX1dJTkRPV18zX1NJWkUJCQkgICAgQ1BVX0hJR0hfUFJPVEVDVF9BRERSRVNTXzMgLyogMHgxYjggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBTbm9vcCBDb250cm9sCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiNkZWZpbmUgU05PT1BfQkFTRV9BRERSRVNTXzAJCQkJICAgICAgMHgzODAKKyNkZWZpbmUgU05PT1BfVE9QX0FERFJFU1NfMAkJCQkgICAgMHgzODgKKyNkZWZpbmUgU05PT1BfQkFTRV9BRERSRVNTXzEJCQkJICAgIDB4MzkwCisjZGVmaW5lIFNOT09QX1RPUF9BRERSRVNTXzEJCQkJICAgIDB4Mzk4CisjZGVmaW5lIFNOT09QX0JBU0VfQUREUkVTU18yCQkJCSAgICAweDNhMAorI2RlZmluZSBTTk9PUF9UT1BfQUREUkVTU18yCQkJCSAgICAweDNhOAorI2RlZmluZSBTTk9PUF9CQVNFX0FERFJFU1NfMwkJCQkgICAgMHgzYjAKKyNkZWZpbmUgU05PT1BfVE9QX0FERFJFU1NfMwkJCQkgICAgMHgzYjgKKyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEludGVncmF0ZWQgU1JBTSBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTUkFNX0NPTkZJRwkJCQkJCTB4MzgwCisjZGVmaW5lIFNSQU1fVEVTVF9NT0RFCQkJCQkJMHgzRjQKKyNkZWZpbmUgU1JBTV9FUlJPUl9DQVVTRQkJCQkJMHgzODgKKyNkZWZpbmUgU1JBTV9FUlJPUl9BRERSCQkJCQkJMHgzOTAKKyNkZWZpbmUgU1JBTV9FUlJPUl9BRERSX0hJR0gJCQkJCTB4M0Y4CisjZGVmaW5lIFNSQU1fRVJST1JfREFUQV9MT1cJCQkJCTB4Mzk4CisjZGVmaW5lIFNSQU1fRVJST1JfREFUQV9ISUdICQkJCQkweDNhMAorI2RlZmluZSBTUkFNX0VSUk9SX0RBVEFfUEFSSVRZCQkJCQkweDNhOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBDUFUgRXJyb3IgUmVwb3J0CQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENQVV9FUlJPUl9BRERSRVNTX0xPVwkJMHgwNzAKKyNkZWZpbmUgQ1BVX0VSUk9SX0FERFJFU1NfSElHSAkJMHgwNzgKKyNkZWZpbmUgQ1BVX0VSUk9SX0RBVEFfTE9XCQkJCQkweDEyOAorI2RlZmluZSBDUFVfRVJST1JfREFUQV9ISUdICQkJCQkweDEzMAorI2RlZmluZSBDUFVfRVJST1JfUEFSSVRZCQkJCQkweDEzOAorI2RlZmluZSBDUFVfRVJST1JfQ0FVU0UJCQkJCQkweDE0MAorI2RlZmluZSBDUFVfRVJST1JfTUFTSwkJCQkJCTB4MTQ4CisKKyNkZWZpbmUgQ1BVX0VSUk9SX0FERFJfTE9XCQkJCQlDUFVfRVJST1JfQUREUkVTU19MT1cgIC8qIDB4MDcwMSAqLworI2RlZmluZSBDUFVfRVJST1JfQUREUl9ISUdICQkJCQlDUFVfRVJST1JfQUREUkVTU19ISUdICS8qIDB4MDc4MSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCSAgICBQc2xhdmUgRGVidWcJCQkqLworLyoJQ1BVIEludGVyZmFjZSBEZWJ1ZyBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhfMF9BRERSRVNTCQkJCQkJMHgzNjAKKyNkZWZpbmUgWF8wX0NPTU1BTkRfSUQJCQkJCQkweDM2OAorI2RlZmluZSBYXzFfQUREUkVTUwkJCQkJCTB4MzcwCisjZGVmaW5lIFhfMV9DT01NQU5EX0lECQkJCQkJMHgzNzgKKyAvKiNkZWZpbmUgV1JJVEVfREFUQV9MT1cJCQkJCTB4M2MwMSAqLworIC8qI2RlZmluZSBXUklURV9EQVRBX0hJR0gJCQkJCTB4M2M4MSAqLworIC8qI2RlZmluZSBXUklURV9CWVRFX0VOQUJMRQkJCQkJMHgzZTAxICovCisgLyojZGVmaW5lIFJFQURfREFUQV9MT1cJCQkJCTB4M2QwMSAqLworIC8qI2RlZmluZSBSRUFEX0RBVEFfSElHSAkJCQkJMHgzZDgxICovCisgLyojZGVmaW5lIFJFQURfSUQJCQkJCQkweDNlODEgKi8KKworI2RlZmluZSBQVU5JVF9TTEFWRV9ERUJVR19MT1cJCQkJCVhfMF9BRERSRVNTICAvKiAweDM2MDEgKi8KKyNkZWZpbmUgUFVOSVRfU0xBVkVfREVCVUdfSElHSAkJCQkJWF8wX0NPTU1BTkRfSUQJLyogMHgzNjgxICovCisjZGVmaW5lIFBVTklUX01BU1RFUl9ERUJVR19MT1cJCQkJCVhfMV9BRERSRVNTICAvKiAweDM3MDEgKi8KKyNkZWZpbmUgUFVOSVRfTUFTVEVSX0RFQlVHX0hJR0gJCQkJICAgWF8xX0NPTU1BTkRfSUQgIC8qIDB4Mzc4MSAqLworI2RlZmluZSBQVU5JVF9NTUFTSwkJCQkJCTB4M2U0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRFJBTSBhbmQgRGV2aWNlIEFkZHJlc3MgU3BhY2UJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRFJBTSBDb25maWd1cmF0aW9uCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRFJBTV9DT05GSUcJCQkJCQkweDE0MDAJLyogTVY2NDI2MCAweDQ0OCBzb21lIGNoYW5nZXMqLworI2RlZmluZSBEX1VOSVRfQ09OVFJPTF9MT1cJCQkJCTB4MTQwNAkvKiBORVcgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworI2RlZmluZSBEX1VOSVRfQ09OVFJPTF9ISUdICQkJCQkweDE0MjQJLyogTkVXIGluIE1WNjQzNjAgYW5kIE1WNjQ0NjAgKi8KKyNkZWZpbmUgU0RSQU1fVElNSU5HX0NPTlRST0xfTE9XCQkJMHgxNDA4CS8qIE1WNjQyNjAgMHg0YjQgbmV3IFNEUkFNIFRJTUlORyBSRUdJU1RFUiAqLworI2RlZmluZSBTRFJBTV9USU1JTkdfQ09OVFJPTF9ISUdICQkJMHgxNDBjCS8qIE1WNjQyNjAgMHg0YjQgbmV3IFNEUkFNIFRJTUlORyBSRUdJU1RFUiAqLworI2RlZmluZSBTRFJBTV9BRERSX0NPTlRST0wJCQkJICAgIDB4MTQxMAkvKiBNVjY0MjYwIDB4NDdjIHNvbWUgY2hhbmdlcyovCisjZGVmaW5lIFNEUkFNX09QRU5fUEFHRVNfQ09OVFJPTAkJCTB4MTQxNAkvKiBORVcgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworI2RlZmluZSBTRFJBTV9PUEVSQVRJT04JCQkJCQkweDE0MTgJLyogTVY2NDI2MCAweDQ3NCBzb21lIGNoYW5nZXMqLworI2RlZmluZSBTRFJBTV9NT0RFCQkJCQkJMHgxNDFjCS8qIE5FVyBpbiBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisjZGVmaW5lIEVYVEVOREVEX0RSQU1fTU9ERQkJCQkJMHgxNDIwCS8qIE5FVyBpbiBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisjZGVmaW5lIFNEUkFNX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCTB4MTQzMAkvKiBNVjY0MjYwIDB4NGE4IE5PIGNoYW5nZXMqLworI2RlZmluZSBTRFJBTV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJMHgxNDM0CS8qIE1WNjQyNjAgMHg0YWMgTk8gY2hhbmdlcyovCisjZGVmaW5lIFNEUkFNX0NST1NTX0JBUl9USU1FT1VUCQkJCTB4MTQzOAkvKiBNVjY0MjYwIDB4NGIwIE5PIGNoYW5nZXMqLworI2RlZmluZSBTRFJBTV9BRERSX0NUUkxfUEFEU19DQUxJQlJBVElPTgkweDE0YzAJLyogd2hhdCBpcyB0aGlzID8/PyAqLworI2RlZmluZSBTRFJBTV9EQVRBX1BBRFNfQ0FMSUJSQVRJT04JCQkweDE0YzQJLyogd2hhdCBpcyB0aGlzID8/PyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRFJBTSBDb25maWd1cmF0aW9uIE1WNjQyNjAJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyojZGVmaW5lIFNEUkFNX0NPTkZJR1VSQVRJT04JCQkweDQ0ODEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fT1BFUkFUSU9OX01PREUJCQkweDQ3NDEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fQUREUkVTU19ERUNPREUJCTB4NDdjMSAqLworIC8qI2RlZmluZSBTRFJBTV9VTUFfQ09OVFJPTAkJCTB4NGE0CWVsaW1pbmF0ZWQgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworIC8qI2RlZmluZSBTRFJBTV9DUk9TU19CQVJfQ09OVFJPTF9MT1cJMHg0YTgxICovCisgLyojZGVmaW5lIFNEUkFNX0NST1NTX0JBUl9DT05UUk9MX0hJR0ggMHg0YWMxICovCisgLyojZGVmaW5lIFNEUkFNX0NST1NTX0JBUl9USU1FT1VUCQkweDRiMDEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fVElNSU5HCQkJCTB4NGI0MSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0RSQU0gRXJyb3IgUmVwb3J0CQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRFJBTV9FUlJPUl9EQVRBX0xPVwkJCQkweDE0NDQJLyogTVY2NDI2MCAweDQ4NCBOTyBjaGFuZ2VzKi8KKyNkZWZpbmUgU0RSQU1fRVJST1JfREFUQV9ISUdICQkJCQkweDE0NDAJLyogTVY2NDI2MCAweDQ4MCBOTyBjaGFuZ2VzKi8KKyNkZWZpbmUgU0RSQU1fRVJST1JfQUREUgkJCQkJMHgxNDUwCS8qIE1WNjQyNjAgMHg0OTAgTk8gY2hhbmdlcyovCisjZGVmaW5lIFNEUkFNX1JFQ0VJVkVEX0VDQwkJCQkJMHgxNDQ4CS8qIE1WNjQyNjAgMHg0ODggTk8gY2hhbmdlcyovCisjZGVmaW5lIFNEUkFNX0NBTENVTEFURURfRUNDCQkJCQkweDE0NGMJLyogTVY2NDI2MCAweDQ4YyBOTyBjaGFuZ2VzKi8KKyNkZWZpbmUgU0RSQU1fRUNDX0NPTlRST0wJCQkJCTB4MTQ1NAkvKiBNVjY0MjYwIDB4NDk0IE5PIGNoYW5nZXMqLworI2RlZmluZSBTRFJBTV9FQ0NfRVJST1JfQ09VTlRFUgkJCQkweDE0NTgJLyogTVY2NDI2MCAweDQ5OCBOTyBjaGFuZ2VzKi8KKyNkZWZpbmUgU0RSQU1fTU1BU0sJCQkJCTB4MUI0MAkvKiBORVcgUmVnaXN0ZXIgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCBETyBOT1QgVVNFICEhISovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFNEUkFNIEVycm9yIFJlcG9ydCBNVjY0MjYwCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qI2RlZmluZSBTRFJBTV9FUlJPUl9EQVRBX0xPVwkJCQkJMHg0ODQxICovCisgLyojZGVmaW5lIFNEUkFNX0VSUk9SX0RBVEFfSElHSAkJCQkweDQ4MDEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fQU5EX0RFVklDRV9FUlJPUl9BRERSRVNTCQkweDQ5MDEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fUkVDRUlWRURfRUNDCQkJCSAgICAgICAweDQ4ODEgKi8KKyAvKiNkZWZpbmUgU0RSQU1fQ0FMQ1VMQVRFRF9FQ0MJCQkJCTB4NDhjMSAqLworIC8qI2RlZmluZSBTRFJBTV9FQ0NfQ09OVFJPTAkJCQkJMHg0OTQxICovCisgLyojZGVmaW5lIFNEUkFNX0VDQ19FUlJPUl9DT1VOVEVSCQkJMHg0OTgxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgQ29udHJvbGxlZCBEZWxheSBMaW5lIChDREwpIFJlZ2lzdGVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREZDRExfQ09ORklHMAkJCQkJCTB4MTQ4MAorI2RlZmluZSBERkNETF9DT05GSUcxCQkJCQkJMHgxNDg0CisjZGVmaW5lIERMTF9XUklURQkJCQkJCTB4MTQ4OAorI2RlZmluZSBETExfUkVBRAkJCQkJCTB4MTQ4YworI2RlZmluZSBTUkFNX0FERFIJCQkJCQkweDE0OTAKKyNkZWZpbmUgU1JBTV9EQVRBMAkJCQkJCTB4MTQ5NAorI2RlZmluZSBTUkFNX0RBVEExCQkJCQkJMHgxNDk4CisjZGVmaW5lIFNSQU1fREFUQTIJCQkJCQkweDE0OWMKKyNkZWZpbmUgREZDTF9QUk9CRQkJCQkJCTB4MTRhMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0RSQU0gUGFyYW1ldGVycyBvbmx5IGluIE1WNjQyNjAJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiNkZWZpbmUgU0RSQU1fQkFOSzBQQVJBTUVURVJTCQkJCTB4NDRDCWVsaW1pbmF0ZWQgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworIC8qI2RlZmluZSBTRFJBTV9CQU5LMVBBUkFNRVRFUlMJCQkJMHg0NTAJZWxpbWluYXRlZCBpbiBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisgLyojZGVmaW5lIFNEUkFNX0JBTksyUEFSQU1FVEVSUwkJCQkweDQ1NAllbGltaW5hdGVkIGluIE1WNjQzNjAgYW5kIE1WNjQ0NjAgKi8KKyAvKiNkZWZpbmUgU0RSQU1fQkFOSzNQQVJBTUVURVJTCQkJCTB4NDU4CWVsaW1pbmF0ZWQgaW4gTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBEZWJ1ZyBSZWdpc3RlcnMJCQkgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERVTklUX0RFQlVHX0xPVwkJCQkJCTB4MTQ2MAorI2RlZmluZSBEVU5JVF9ERUJVR19ISUdICQkJCQkweDE0NjQKKyNkZWZpbmUgRFVOSVRfTU1BU0sJCQkJCQkweDFiNDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRHVuaXQgRGVidWcgKGZvciBpbnRlcm5hbCB1c2UpCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBYMF9BRERSRVNTCQkJCQkgICAgMHg1MDAKKyNkZWZpbmUgWDBfQ09NTUFORF9BTkRfSUQJCQkJICAgIDB4NTA0CisjZGVmaW5lIFgwX1dSSVRFX0RBVEFfTE9XCQkJCSAgICAweDUwOAorI2RlZmluZSBYMF9XUklURV9EQVRBX0hJR0gJCQkJICAgIDB4NTBjCisjZGVmaW5lIFgwX1dSSVRFX0JZVEVfRU5BQkxFCQkJCSAgICAweDUxOAorI2RlZmluZSBYMF9SRUFEX0RBVEFfTE9XCQkJCSAgICAweDUxMAorI2RlZmluZSBYMF9SRUFEX0RBVEFfSElHSAkJCQkgICAgMHg1MTQKKyNkZWZpbmUgWDBfUkVBRF9JRAkJCQkJICAgIDB4NTFjCisjZGVmaW5lIFgxX0FERFJFU1MJCQkJCSAgICAweDUyMAorI2RlZmluZSBYMV9DT01NQU5EX0FORF9JRAkJCQkgICAgMHg1MjQKKyNkZWZpbmUgWDFfV1JJVEVfREFUQV9MT1cJCQkJICAgIDB4NTI4CisjZGVmaW5lIFgxX1dSSVRFX0RBVEFfSElHSAkJCQkgICAgMHg1MmMKKyNkZWZpbmUgWDFfV1JJVEVfQllURV9FTkFCTEUJCQkJICAgIDB4NTM4CisjZGVmaW5lIFgxX1JFQURfREFUQV9MT1cJCQkJICAgIDB4NTMwCisjZGVmaW5lIFgxX1JFQURfREFUQV9ISUdICQkJCSAgICAweDUzNAorI2RlZmluZSBYMV9SRUFEX0lECQkJCQkgICAgMHg1M2MKKyNkZWZpbmUgWDBfU05PT1BfQUREUkVTUwkJCQkgICAgMHg1NDAKKyNkZWZpbmUgWDBfU05PT1BfQ09NTUFORAkJCQkgICAgMHg1NDQKKyNkZWZpbmUgWDFfU05PT1BfQUREUkVTUwkJCQkgICAgMHg1NDgKKyNkZWZpbmUgWDFfU05PT1BfQ09NTUFORAkJCQkgICAgMHg1NGMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgUGFyYW1ldGVycwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFVklDRV9CQU5LMFBBUkFNRVRFUlMJCQkJMHg0NWMKKyNkZWZpbmUgREVWSUNFX0JBTksxUEFSQU1FVEVSUwkJCQkweDQ2MAorI2RlZmluZSBERVZJQ0VfQkFOSzJQQVJBTUVURVJTCQkJCTB4NDY0CisjZGVmaW5lIERFVklDRV9CQU5LM1BBUkFNRVRFUlMJCQkJMHg0NjgKKyNkZWZpbmUgREVWSUNFX0JPT1RfQkFOS19QQVJBTUVURVJTCQkJMHg0NmMKKyNkZWZpbmUgREVWSUNFX0NPTlRST0wJCQkJCQkJMHg0YzAKKyNkZWZpbmUgREVWSUNFX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCQkweDRjOAorI2RlZmluZSBERVZJQ0VfQ1JPU1NfQkFSX0NPTlRST0xfSElHSAkJCQkweDRjYworI2RlZmluZSBERVZJQ0VfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJMHg0YzQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgUGFyYW1ldGVycwkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFVklDRV9CQU5LMF9QQVJBTUVURVJTCQkJREVWSUNFX0JBTkswUEFSQU1FVEVSUwkvKiAweDQ1YzEgKi8KKyNkZWZpbmUgREVWSUNFX0JBTksxX1BBUkFNRVRFUlMJCQlERVZJQ0VfQkFOSzFQQVJBTUVURVJTCS8qIDB4NDYwMSAqLworI2RlZmluZSBERVZJQ0VfQkFOSzJfUEFSQU1FVEVSUwkJCURFVklDRV9CQU5LMlBBUkFNRVRFUlMJLyogMHg0NjQxICovCisjZGVmaW5lIERFVklDRV9CQU5LM19QQVJBTUVURVJTCQkJREVWSUNFX0JBTkszUEFSQU1FVEVSUwkvKiAweDQ2ODEgKi8KKy8qI2RlZmluZSBERVZJQ0VfQk9PVF9CQU5LX1BBUkFNRVRFUlMJCQkgMHg0NmMxICovCisjZGVmaW5lIERFVklDRV9JTlRFUkZBQ0VfQ09OVFJPTAkJCQlERVZJQ0VfQ09OVFJPTAkvKiAweDRjMDEgKi8KKyNkZWZpbmUgREVWSUNFX0lOVEVSRkFDRV9DUk9TU19CQVJfQ09OVFJPTF9MT1cJCURFVklDRV9DUk9TU19CQVJfQ09OVFJPTF9MT1cgIC8qIDB4NGM4MSAqLworI2RlZmluZSBERVZJQ0VfSU5URVJGQUNFX0NST1NTX0JBUl9DT05UUk9MX0hJR0gJCURFVklDRV9DUk9TU19CQVJfQ09OVFJPTF9ISUdIICAvKiAweDRjYzEgKi8KKyNkZWZpbmUgREVWSUNFX0lOVEVSRkFDRV9DUk9TU19CQVJfVElNRU9VVAkJCURFVklDRV9DUk9TU19CQVJfVElNRU9VVCAgLyogMHg0YzQxICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgSW50ZXJydXB0CQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREVWSUNFX0lOVEVSUlVQVF9DQVVTRQkJCQkJCTB4NGQwCisjZGVmaW5lIERFVklDRV9JTlRFUlJVUFRfTUFTSwkJCQkJCTB4NGQ0CisjZGVmaW5lIERFVklDRV9FUlJPUl9BRERSRVNTCQkJCQkJMHg0ZDgKKyAvKiNkZWZpbmUgREVWSUNFX0lOVEVSUlVQVF9DQVVTRQkJCQkweDRkMDEgKi8KKyAvKiNkZWZpbmUgREVWSUNFX0lOVEVSUlVQVF9NQVNLCQkJCTB4NGQ0MSAqLworI2RlZmluZSBERVZJQ0VfRVJST1JfQUREUgkJCQlERVZJQ0VfRVJST1JfQUREUkVTUyAgLyoweDRkODEgKi8KKyNkZWZpbmUgREVWSUNFX0VSUk9SX0RBVEEJCQkJMHg0ZGMKKyNkZWZpbmUgREVWSUNFX0VSUk9SX1BBUklUWQkJCQkJMHg0ZTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgZGVidWcgcmVnaXN0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFVklDRV9ERUJVR19MT1cJCQkJCTB4NGU0CisjZGVmaW5lIERFVklDRV9ERUJVR19ISUdICQkJCTB4NGU4CisjZGVmaW5lIFJVTklUX01NQVNLCQkJCQkJCTB4NGYwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BIFJlY29yZAkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiNkZWZpbmUgQ0hBTk5FTDRfRE1BX0JZVEVfQ09VTlQJCQkweDkwMDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDVfRE1BX0JZVEVfQ09VTlQJCQkweDkwNDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDZfRE1BX0JZVEVfQ09VTlQJCQkweDkwODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdfRE1BX0JZVEVfQ09VTlQJCQkweDkwQzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDRfRE1BX1NPVVJDRV9BRERSRVNTCQkweDkxMDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDVfRE1BX1NPVVJDRV9BRERSRVNTCQkweDkxNDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDZfRE1BX1NPVVJDRV9BRERSRVNTCQkweDkxODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdfRE1BX1NPVVJDRV9BRERSRVNTCQkweDkxQzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDRfRE1BX0RFU1RJTkFUSU9OX0FERFJFU1MJCTB4OTIwMSAqLworIC8qI2RlZmluZSBDSEFOTkVMNV9ETUFfREVTVElOQVRJT05fQUREUkVTUwkJMHg5MjQxICovCisgLyojZGVmaW5lIENIQU5ORUw2X0RNQV9ERVNUSU5BVElPTl9BRERSRVNTCQkweDkyODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdfRE1BX0RFU1RJTkFUSU9OX0FERFJFU1MJCTB4OTJDMSAqLworIC8qI2RlZmluZSBDSEFOTkVMNE5FWFRfUkVDT1JEX1BPSU5URVIJCQkweDkzMDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDVORVhUX1JFQ09SRF9QT0lOVEVSCQkJMHg5MzQxICovCisgLyojZGVmaW5lIENIQU5ORUw2TkVYVF9SRUNPUkRfUE9JTlRFUgkJCTB4OTM4MSAqLworIC8qI2RlZmluZSBDSEFOTkVMN05FWFRfUkVDT1JEX1BPSU5URVIJCQkweDkzQzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDRDVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJMHg5NzAxICovCisgLyojZGVmaW5lIENIQU5ORUw1Q1VSUkVOVF9ERVNDUklQVE9SX1BPSU5URVIJCTB4OTc0MSAqLworIC8qI2RlZmluZSBDSEFOTkVMNkNVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDk3ODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdDVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJMHg5N0MxICovCisgLyojZGVmaW5lIENIQU5ORUwwX0RNQV9TT1VSQ0VfSElHSF9QQ0lfQUREUkVTUwkJICAgICAgIDB4ODkwMSAqLworIC8qI2RlZmluZSBDSEFOTkVMMV9ETUFfU09VUkNFX0hJR0hfUENJX0FERFJFU1MJCSAgICAgICAweDg5NDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDJfRE1BX1NPVVJDRV9ISUdIX1BDSV9BRERSRVNTCQkgICAgICAgMHg4OTgxICovCisgLyojZGVmaW5lIENIQU5ORUwzX0RNQV9TT1VSQ0VfSElHSF9QQ0lfQUREUkVTUwkJICAgICAgIDB4ODljMSAqLworIC8qI2RlZmluZSBDSEFOTkVMNF9ETUFfU09VUkNFX0hJR0hfUENJX0FERFJFU1MJCSAgICAgICAweDk5MDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDVfRE1BX1NPVVJDRV9ISUdIX1BDSV9BRERSRVNTCQkgICAgICAgMHg5OTQxICovCisgLyojZGVmaW5lIENIQU5ORUw2X0RNQV9TT1VSQ0VfSElHSF9QQ0lfQUREUkVTUwkJICAgICAgIDB4OTk4MSAqLworIC8qI2RlZmluZSBDSEFOTkVMN19ETUFfU09VUkNFX0hJR0hfUENJX0FERFJFU1MJCSAgICAgICAweDk5YzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDBfRE1BX0RFU1RJTkFUSU9OX0hJR0hfUENJX0FERFJFU1MJICAgICAgIDB4OGEwMSAqLworIC8qI2RlZmluZSBDSEFOTkVMMV9ETUFfREVTVElOQVRJT05fSElHSF9QQ0lfQUREUkVTUwkgICAgICAgMHg4YTQxICovCisgLyojZGVmaW5lIENIQU5ORUwyX0RNQV9ERVNUSU5BVElPTl9ISUdIX1BDSV9BRERSRVNTCSAgICAgICAweDhhODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDNfRE1BX0RFU1RJTkFUSU9OX0hJR0hfUENJX0FERFJFU1MJICAgICAgIDB4OGFjMSAqLworIC8qI2RlZmluZSBDSEFOTkVMNF9ETUFfREVTVElOQVRJT05fSElHSF9QQ0lfQUREUkVTUwkgICAgICAgMHg5YTAxICovCisgLyojZGVmaW5lIENIQU5ORUw1X0RNQV9ERVNUSU5BVElPTl9ISUdIX1BDSV9BRERSRVNTCSAgICAgICAweDlhNDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDZfRE1BX0RFU1RJTkFUSU9OX0hJR0hfUENJX0FERFJFU1MJICAgICAgIDB4OWE4MSAqLworIC8qI2RlZmluZSBDSEFOTkVMN19ETUFfREVTVElOQVRJT05fSElHSF9QQ0lfQUREUkVTUwkgICAgICAgMHg5YWMxICovCisgLyojZGVmaW5lIENIQU5ORUwwX0RNQV9ORVhUX1JFQ09SRF9QT0lOVEVSX0hJR0hfUENJX0FERFJFU1MgICAweDhiMDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDFfRE1BX05FWFRfUkVDT1JEX1BPSU5URVJfSElHSF9QQ0lfQUREUkVTUyAgIDB4OGI0MSAqLworIC8qI2RlZmluZSBDSEFOTkVMMl9ETUFfTkVYVF9SRUNPUkRfUE9JTlRFUl9ISUdIX1BDSV9BRERSRVNTICAgMHg4YjgxICovCisgLyojZGVmaW5lIENIQU5ORUwzX0RNQV9ORVhUX1JFQ09SRF9QT0lOVEVSX0hJR0hfUENJX0FERFJFU1MgICAweDhiYzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDRfRE1BX05FWFRfUkVDT1JEX1BPSU5URVJfSElHSF9QQ0lfQUREUkVTUyAgIDB4OWIwMSAqLworIC8qI2RlZmluZSBDSEFOTkVMNV9ETUFfTkVYVF9SRUNPUkRfUE9JTlRFUl9ISUdIX1BDSV9BRERSRVNTICAgMHg5YjQxICovCisgLyojZGVmaW5lIENIQU5ORUw2X0RNQV9ORVhUX1JFQ09SRF9QT0lOVEVSX0hJR0hfUENJX0FERFJFU1MgICAweDliODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdfRE1BX05FWFRfUkVDT1JEX1BPSU5URVJfSElHSF9QQ0lfQUREUkVTUyAgIDB4OWJjMSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERNQSBDaGFubmVsIENvbnRyb2wJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDSEFOTkVMMENPTlRST0wJCQkJCTB4ODQwCisjZGVmaW5lIENIQU5ORUwwQ09OVFJPTF9ISUdICQkJCTB4ODgwCisjZGVmaW5lIENIQU5ORUwxQ09OVFJPTAkJCQkJMHg4NDQKKyNkZWZpbmUgQ0hBTk5FTDFDT05UUk9MX0hJR0gJCQkJMHg4ODQKKyNkZWZpbmUgQ0hBTk5FTDJDT05UUk9MCQkJCQkweDg0OAorI2RlZmluZSBDSEFOTkVMMkNPTlRST0xfSElHSAkJCQkweDg4OAorI2RlZmluZSBDSEFOTkVMM0NPTlRST0wJCQkJCTB4ODRDCisjZGVmaW5lIENIQU5ORUwzQ09OVFJPTF9ISUdICQkJCTB4ODhDCisKKyNkZWZpbmUgRE1BX0NIQU5ORUwwX0NPTlRST0wJCQkJQ0hBTk5FTDBDT05UUk9MCSAvKjB4ODQwMSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDBfQ09OVFJPTF9ISUdICQkJQ0hBTk5FTDBDT05UUk9MX0hJR0ggIC8qMHg4ODAxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMV9DT05UUk9MCQkJCUNIQU5ORUwxQ09OVFJPTAkgLyogMHg4NDQxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMV9DT05UUk9MX0hJR0gJCQlDSEFOTkVMMUNPTlRST0xfSElHSCAgLyoweDg4NDEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwyX0NPTlRST0wJCQkJQ0hBTk5FTDJDT05UUk9MCSAvKjB4ODQ4MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDJfQ09OVFJPTF9ISUdICQkJQ0hBTk5FTDJDT05UUk9MX0hJR0ggIC8qMHg4ODgxICovCisjZGVmaW5lIERNQV9DSEFOTkVMM19DT05UUk9MCQkJCUNIQU5ORUwzQ09OVFJPTAkgLyoweDg0QzEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwzX0NPTlRST0xfSElHSAkJCUNIQU5ORUwzQ09OVFJPTF9ISUdIICAvKjB4ODhDMSAqLworCisgLyojZGVmaW5lIENIQU5ORUw0Q09OVFJPTAkJCQkweDk0MDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDRDT05UUk9MX0hJR0gJCQkJMHg5ODAxICovCisgLyojZGVmaW5lIENIQU5ORUw1Q09OVFJPTAkJCQkweDk0NDEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDVDT05UUk9MX0hJR0gJCQkJMHg5ODQxICovCisgLyojZGVmaW5lIENIQU5ORUw2Q09OVFJPTAkJCQkweDk0ODEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDZDT05UUk9MX0hJR0gJCQkJMHg5ODgxICovCisgLyojZGVmaW5lIENIQU5ORUw3Q09OVFJPTAkJCQkweDk0QzEgKi8KKyAvKiNkZWZpbmUgQ0hBTk5FTDdDT05UUk9MX0hJR0gJCQkJMHg5OEMxICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBETUEgQXJiaXRlcgkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiNkZWZpbmUgQVJCSVRFUl9DT05UUk9MXzBfMwkJCQkweDg2MDEgKi8KKyNkZWZpbmUgQVJCSVRFUl9DT05UUk9MXzRfNwkJCQkweDk2MAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgICAgIElETUEgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRE1BX0NIQU5ORUwwX0JZVEVfQ09VTlQJCQkJCUNIQU5ORUwwX0RNQV9CWVRFX0NPVU5UCSAvKjB4ODAwMSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDFfQllURV9DT1VOVAkJCQkJQ0hBTk5FTDFfRE1BX0JZVEVfQ09VTlQJIC8qMHg4MDQxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMl9CWVRFX0NPVU5UCQkJCQlDSEFOTkVMMl9ETUFfQllURV9DT1VOVAkgLyoweDgwODEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwzX0JZVEVfQ09VTlQJCQkJCUNIQU5ORUwzX0RNQV9CWVRFX0NPVU5UCSAvKjB4ODBDMSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDBfU09VUkNFX0FERFIJCQkJQ0hBTk5FTDBfRE1BX1NPVVJDRV9BRERSRVNTICAvKjB4ODEwMSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDFfU09VUkNFX0FERFIJCQkJQ0hBTk5FTDFfRE1BX1NPVVJDRV9BRERSRVNTICAvKjB4ODE0MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDJfU09VUkNFX0FERFIJCQkJQ0hBTk5FTDJfRE1BX1NPVVJDRV9BRERSRVNTICAvKjB4ODE4MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDNfU09VUkNFX0FERFIJCQkJQ0hBTk5FTDNfRE1BX1NPVVJDRV9BRERSRVNTICAvKjB4ODFjMSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDBfREVTVElOQVRJT05fQUREUgkJCQlDSEFOTkVMMF9ETUFfREVTVElOQVRJT05fQUREUkVTUyAgLyoweDgyMDEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwxX0RFU1RJTkFUSU9OX0FERFIJCQkJQ0hBTk5FTDFfRE1BX0RFU1RJTkFUSU9OX0FERFJFU1MgIC8qMHg4MjQxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMl9ERVNUSU5BVElPTl9BRERSCQkJCUNIQU5ORUwyX0RNQV9ERVNUSU5BVElPTl9BRERSRVNTICAvKjB4ODI4MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDNfREVTVElOQVRJT05fQUREUgkJCQlDSEFOTkVMM19ETUFfREVTVElOQVRJT05fQUREUkVTUyAgLyoweDgyQzEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwwX05FWFRfREVTQ1JJUFRPUl9QT0lOVEVSCQlDSEFOTkVMME5FWFRfUkVDT1JEX1BPSU5URVIgIC8qMHg4MzAxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMV9ORVhUX0RFU0NSSVBUT1JfUE9JTlRFUgkJQ0hBTk5FTDFORVhUX1JFQ09SRF9QT0lOVEVSICAvKjB4ODM0MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDJfTkVYVF9ERVNDUklQVE9SX1BPSU5URVIJCUNIQU5ORUwyTkVYVF9SRUNPUkRfUE9JTlRFUiAgLyoweDgzODEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwzX05FWFRfREVTQ1JJUFRPUl9QT0lOVEVSCQlDSEFOTkVMM05FWFRfUkVDT1JEX1BPSU5URVIgIC8qMHg4M0MxICovCisjZGVmaW5lIERNQV9DSEFOTkVMMF9DVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJQ0hBTk5FTDBDVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUiAgLyoweDg3MDEgKi8KKyNkZWZpbmUgRE1BX0NIQU5ORUwxX0NVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQlDSEFOTkVMMUNVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSICAvKjB4ODc0MSAqLworI2RlZmluZSBETUFfQ0hBTk5FTDJfQ1VSUkVOVF9ERVNDUklQVE9SX1BPSU5URVIJCUNIQU5ORUwyQ1VSUkVOVF9ERVNDUklQVE9SX1BPSU5URVIgIC8qMHg4NzgxICovCisjZGVmaW5lIERNQV9DSEFOTkVMM19DVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUgkJQ0hBTk5FTDNDVVJSRU5UX0RFU0NSSVBUT1JfUE9JTlRFUiAgLyoweDg3QzEgKi8KKworI2RlZmluZSBDSEFOTkVMM0NVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDg3QworI2RlZmluZSBDSEFOTkVMMkNVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDg3OAorI2RlZmluZSBDSEFOTkVMMUNVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDg3NAorI2RlZmluZSBDSEFOTkVMMENVUlJFTlRfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDg3MAorI2RlZmluZSBDSEFOTkVMME5FWFRfUkVDT1JEX1BPSU5URVIJCQkweDgzMAorI2RlZmluZSBDSEFOTkVMMU5FWFRfUkVDT1JEX1BPSU5URVIJCQkweDgzNAorI2RlZmluZSBDSEFOTkVMMk5FWFRfUkVDT1JEX1BPSU5URVIJCQkweDgzOAorI2RlZmluZSBDSEFOTkVMM05FWFRfUkVDT1JEX1BPSU5URVIJCQkweDgzQworI2RlZmluZSBDSEFOTkVMMF9ETUFfREVTVElOQVRJT05fQUREUkVTUwkJMHg4MjAKKyNkZWZpbmUgQ0hBTk5FTDFfRE1BX0RFU1RJTkFUSU9OX0FERFJFU1MJCTB4ODI0CisjZGVmaW5lIENIQU5ORUwyX0RNQV9ERVNUSU5BVElPTl9BRERSRVNTCQkweDgyOAorI2RlZmluZSBDSEFOTkVMM19ETUFfREVTVElOQVRJT05fQUREUkVTUwkJMHg4MkMKKyNkZWZpbmUgQ0hBTk5FTDBfRE1BX1NPVVJDRV9BRERSRVNTCQkJMHg4MTAKKyNkZWZpbmUgQ0hBTk5FTDFfRE1BX1NPVVJDRV9BRERSRVNTCQkJMHg4MTQKKyNkZWZpbmUgQ0hBTk5FTDJfRE1BX1NPVVJDRV9BRERSRVNTCQkJMHg4MTgKKyNkZWZpbmUgQ0hBTk5FTDNfRE1BX1NPVVJDRV9BRERSRVNTCQkJMHg4MUMKKyNkZWZpbmUgQ0hBTk5FTDBfRE1BX0JZVEVfQ09VTlQJCQkweDgwMAorI2RlZmluZSBDSEFOTkVMMV9ETUFfQllURV9DT1VOVAkJCTB4ODA0CisjZGVmaW5lIENIQU5ORUwyX0RNQV9CWVRFX0NPVU5UCQkJMHg4MDgKKyNkZWZpbmUgQ0hBTk5FTDNfRE1BX0JZVEVfQ09VTlQJCQkweDgwQworCisgLyogIElETUEgQWRkcmVzcyBEZWNvZGluZyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXJzICAqLworCisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHMAkJCQkJCTB4YTAwCisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHMQkJCQkJCTB4YTA4CisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHMgkJCQkJCTB4YTEwCisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHMwkJCQkJCTB4YTE4CisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHNAkJCQkJCTB4YTIwCisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHNQkJCQkJCTB4YTI4CisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHNgkJCQkJCTB4YTMwCisjZGVmaW5lIERNQV9CQVNFX0FERFJfUkVHNwkJCQkJCTB4YTM4CisKKyAvKiAgSURNQSBBZGRyZXNzIERlY29kaW5nIFNpemUgQWRkcmVzcyBSZWdpc3RlciAgICovCisKKyNkZWZpbmUgRE1BX1NJWkVfUkVHMAkJCQkJCQkweGEwNAorI2RlZmluZSBETUFfU0laRV9SRUcxCQkJCQkJCTB4YTBjCisjZGVmaW5lIERNQV9TSVpFX1JFRzIJCQkJCQkJMHhhMTQKKyNkZWZpbmUgRE1BX1NJWkVfUkVHMwkJCQkJCQkweGExYworI2RlZmluZSBETUFfU0laRV9SRUc0CQkJCQkJCTB4YTI0CisjZGVmaW5lIERNQV9TSVpFX1JFRzUJCQkJCQkJMHhhMmMKKyNkZWZpbmUgRE1BX1NJWkVfUkVHNgkJCQkJCQkweGEzNAorI2RlZmluZSBETUFfU0laRV9SRUc3CQkJCQkJCTB4YTNDCisKKyAgICAvKiBJRE1BIEFkZHJlc3MgRGVjb2RpbmcgSGlnaCBBZGRyZXNzIFJlbWFwIGFuZCBBY2Nlc3MKKwkJICBQcm90ZWN0aW9uIFJlZ2lzdGVycwkJCSAgKi8KKworI2RlZmluZSBETUFfSElHSF9BRERSX1JFTUFQX1JFRzAJCQkJMHhhNjAKKyNkZWZpbmUgRE1BX0hJR0hfQUREUl9SRU1BUF9SRUcxCQkJCTB4YTY0CisjZGVmaW5lIERNQV9ISUdIX0FERFJfUkVNQVBfUkVHMgkJCQkweGE2OAorI2RlZmluZSBETUFfSElHSF9BRERSX1JFTUFQX1JFRzMJCQkJMHhhNkMKKyNkZWZpbmUgRE1BX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJCTB4YTgwCisjZGVmaW5lIERNQV9DSEFOTkVMMF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCTB4YTcwCisjZGVmaW5lIERNQV9DSEFOTkVMMV9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgIDB4YTc0CisjZGVmaW5lIERNQV9DSEFOTkVMMl9BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgIDB4YTc4CisjZGVmaW5lIERNQV9DSEFOTkVMM19BQ0NFU1NfUFJPVEVDVElPTl9SRUcJCSAgIDB4YTdjCisjZGVmaW5lIERNQV9BUkJJVEVSX0NPTlRST0wJCQkJCQkweDg2MAorI2RlZmluZSBETUFfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJCTB4OGQwCisKKyAvKiAgSURNQSBIZWFkZXJzIFJldGFyZ2V0IFJlZ2lzdGVycyAgICovCisKKyAvKiNkZWZpbmUgQ1BVX0lETUFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJMHgzZTAxICovCisgLyojZGVmaW5lIENQVV9JRE1BX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCSAweDNlODEgKi8KKworI2RlZmluZSBETUFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJMHhhODQKKyNkZWZpbmUgRE1BX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCTB4YTg4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRE1BIEludGVycnVwdAkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDSEFORUxTMF8zX0lOVEVSUlVQVF9DQVVTRQkJCTB4OGMwCisjZGVmaW5lIENIQU5FTFMwXzNfSU5URVJSVVBUX01BU0sJCQkweDhjNAorI2RlZmluZSBDSEFORUxTMF8zX0VSUk9SX0FERFJFU1MJCQkweDhjOAorI2RlZmluZSBDSEFORUxTMF8zX0VSUk9SX1NFTEVDVAkJCQkweDhjYworIC8qI2RlZmluZSBDSEFORUxTNF83X0lOVEVSUlVQVF9DQVVTRQkJCTB4OWMwMSAqLworIC8qI2RlZmluZSBDSEFORUxTNF83X0lOVEVSUlVQVF9NQVNLCQkJMHg5YzQxICovCisgLyojZGVmaW5lIENIQU5FTFM0XzdfRVJST1JfQUREUkVTUwkJCTB4OWM4MSAqLworIC8qI2RlZmluZSBDSEFORUxTNF83X0VSUk9SX1NFTEVDVAkJCTB4OWNjMSAqLworCisjZGVmaW5lIERNQV9JTlRFUlJVUFRfQ0FVU0VfUkVHCQkJCUNIQU5FTFMwXzNfSU5URVJSVVBUX0NBVVNFICAvKjB4OGMwMSAqLworI2RlZmluZSBETUFfSU5URVJSVVBUX0NBVVNFX01BU0sJCQlDSEFORUxTMF8zX0lOVEVSUlVQVF9NQVNLICAvKjB4OGM0MSAqLworI2RlZmluZSBETUFfRVJST1JfQUREUgkJCQkJCUNIQU5FTFMwXzNfRVJST1JfQUREUkVTUyAgLyoweDhjODEgKi8KKyNkZWZpbmUgRE1BX0VSUk9SX1NFTEVDVAkJCQkJQ0hBTkVMUzBfM19FUlJPUl9TRUxFQ1QJIC8qMHg4Y2MxICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBETUEgRGVidWcgKGZvciBpbnRlcm5hbCB1c2UpCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRE1BX1gwX0FERFJFU1MJCQkJCQkweDhlMAorI2RlZmluZSBETUFfWDBfQ09NTUFORF9BTkRfSUQJCQkJMHg4ZTQKKyAvKiNkZWZpbmUgRE1BX1gwX1dSSVRFX0RBVEFfTE9XCQkJCTB4OGU4MSAqLworIC8qI2RlZmluZSBETUFfWDBfV1JJVEVfREFUQV9ISUdICQkJCTB4OGVjMSAqLworIC8qI2RlZmluZSBETUFfWDBfV1JJVEVfQllURV9FTkFCTEUJCQkJMHg4ZjgxICovCisgLyojZGVmaW5lIERNQV9YMF9SRUFEX0RBVEFfTE9XCQkJCQkweDhmMDEgKi8KKyAvKiNkZWZpbmUgRE1BX1gwX1JFQURfREFUQV9ISUdICQkJCTB4OGY0MSAqLworIC8qI2RlZmluZSBETUFfWDBfUkVBRF9JRAkJCQkJMHg4ZmMxICovCisgLyojZGVmaW5lIERNQV9YMV9BRERSRVNTCQkJCQkweDllMDEgKi8KKyAvKiNkZWZpbmUgRE1BX1gxX0NPTU1BTkRfQU5EX0lECQkJMHg5ZTQxICovCisgLyojZGVmaW5lIERNQV9YMV9XUklURV9EQVRBX0xPVwkJCQkweDllODEgKi8KKyAvKiNkZWZpbmUgRE1BX1gxX1dSSVRFX0RBVEFfSElHSAkJCQkweDllYzEgKi8KKyAvKiNkZWZpbmUgRE1BX1gxX1dSSVRFX0JZVEVfRU5BQkxFCQkJCTB4OWY4MSAqLworIC8qI2RlZmluZSBETUFfWDFfUkVBRF9EQVRBX0xPVwkJCQkJMHg5ZjAxICovCisgLyojZGVmaW5lIERNQV9YMV9SRUFEX0RBVEFfSElHSAkJCQkweDlmNDEgKi8KKyAvKiNkZWZpbmUgRE1BX1gxX1JFQURfSUQJCQkJCTB4OWZjMSAqLworCisgLyogIElETUEgRGVidWcgUmVnaXN0ZXIgKCBmb3IgaW50ZXJuYWwgdXNlICkJICovCisKKyNkZWZpbmUgRE1BX0RFQlVHX0xPVwkJCQkJCURNQV9YMF9BRERSRVNTCS8qIDB4OGUwMSAqLworI2RlZmluZSBETUFfREVCVUdfSElHSAkJCQkJCURNQV9YMF9DT01NQU5EX0FORF9JRCAgLyoweDhlNDEgKi8KKyNkZWZpbmUgRE1BX1NQQVJFCQkJCQkJMHhBOEMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRpbWVyX0NvdW50ZXIJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVElNRVJfQ09VTlRFUjAJCQkJCTB4ODUwCisjZGVmaW5lIFRJTUVSX0NPVU5URVIxCQkJCQkweDg1NAorI2RlZmluZSBUSU1FUl9DT1VOVEVSMgkJCQkJMHg4NTgKKyNkZWZpbmUgVElNRVJfQ09VTlRFUjMJCQkJCTB4ODVDCisjZGVmaW5lIFRJTUVSX0NPVU5URVJfMF8zX0NPTlRST0wJCQkweDg2NAorI2RlZmluZSBUSU1FUl9DT1VOVEVSXzBfM19JTlRFUlJVUFRfQ0FVU0UJCTB4ODY4CisjZGVmaW5lIFRJTUVSX0NPVU5URVJfMF8zX0lOVEVSUlVQVF9NQVNLCQkweDg2YworIC8qI2RlZmluZSBUSU1FUl9DT1VOVEVSNAkJCQkJMHg5NTAxICovCisgLyojZGVmaW5lIFRJTUVSX0NPVU5URVI1CQkJCQkweDk1NDEgKi8KKyAvKiNkZWZpbmUgVElNRVJfQ09VTlRFUjYJCQkJCTB4OTU4MSAqLworIC8qI2RlZmluZSBUSU1FUl9DT1VOVEVSNwkJCQkJMHg5NUMxICovCisgLyojZGVmaW5lIFRJTUVSX0NPVU5URVJfNF83X0NPTlRST0wJCQkweDk2NDEgKi8KKyAvKiNkZWZpbmUgVElNRVJfQ09VTlRFUl80XzdfSU5URVJSVVBUX0NBVVNFCQkweDk2ODEgKi8KKyAvKiNkZWZpbmUgVElNRVJfQ09VTlRFUl80XzdfSU5URVJSVVBUX01BU0sJCQkweDk2YzEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgU2xhdmUgQWRkcmVzcyBEZWNvZGluZwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgU2xhdmUgQWRkcmVzcyBEZWNvZGluZyByZWdpc3RlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQQ0lfMF9DU18wX0JBTktfU0laRQkJCQkJUENJXzBTQ1NfMF9CQU5LX1NJWkUgIC8qMHhjMDgxICovCisjZGVmaW5lIFBDSV8xX0NTXzBfQkFOS19TSVpFCQkJCQlQQ0lfMVNDU18wX0JBTktfU0laRSAgLyogMHhjODgxICovCisjZGVmaW5lIFBDSV8wX0NTXzFfQkFOS19TSVpFCQkJCQlQQ0lfMFNDU18xX0JBTktfU0laRSAgLyoweGQwODEgKi8KKyNkZWZpbmUgUENJXzFfQ1NfMV9CQU5LX1NJWkUJCQkJCVBDSV8xU0NTXzFfQkFOS19TSVpFICAvKiAweGQ4ODEgKi8KKyNkZWZpbmUgUENJXzBfQ1NfMl9CQU5LX1NJWkUJCQkJCVBDSV8wU0NTXzJfQkFOS19TSVpFICAvKjB4YzBjMSAqLworI2RlZmluZSBQQ0lfMV9DU18yX0JBTktfU0laRQkJCQkJUENJXzFTQ1NfMl9CQU5LX1NJWkUgIC8qMHhjOGMxICovCisjZGVmaW5lIFBDSV8wX0NTXzNfQkFOS19TSVpFCQkJCQlQQ0lfMFNDU18zX0JBTktfU0laRSAgLyoweGQwYzEgKi8KKyNkZWZpbmUgUENJXzFfQ1NfM19CQU5LX1NJWkUJCQkJCVBDSV8xU0NTXzNfQkFOS19TSVpFICAvKjB4ZDhjMSAqLworI2RlZmluZSBQQ0lfMF9ERVZDU18wX0JBTktfU0laRQkJCQkJUENJXzBDU18wX0JBTktfU0laRSAgLyoweGMxMDEgKi8KKyNkZWZpbmUgUENJXzFfREVWQ1NfMF9CQU5LX1NJWkUJCQkJICAgIFBDSV8xQ1NfMF9CQU5LX1NJWkUJIC8qMHhjOTAxICovCisjZGVmaW5lIFBDSV8wX0RFVkNTXzFfQkFOS19TSVpFCQkJCSAgICBQQ0lfMENTXzFfQkFOS19TSVpFCSAvKjB4ZDEwMSAqLworI2RlZmluZSBQQ0lfMV9ERVZDU18xX0JBTktfU0laRQkJCQkgICAgUENJXzFDU18xX0JBTktfU0laRQkgLyogMHhkOTAxICovCisjZGVmaW5lIFBDSV8wX0RFVkNTXzJfQkFOS19TSVpFCQkJCSAgICBQQ0lfMENTXzJfQkFOS19TSVpFCSAvKiAweGQxODEgKi8KKyNkZWZpbmUgUENJXzFfREVWQ1NfMl9CQU5LX1NJWkUJCQkJICAgIFBDSV8xQ1NfMl9CQU5LX1NJWkUJIC8qMHhkOTgxICovCisjZGVmaW5lIFBDSV8wX0RFVkNTXzNfQkFOS19TSVpFCQkJCSAgICBQQ0lfMENTXzNfQkFOS19TSVpFCSAvKiAweGMxNDEgKi8KKyNkZWZpbmUgUENJXzFfREVWQ1NfM19CQU5LX1NJWkUJCQkJICAgIFBDSV8xQ1NfM19CQU5LX1NJWkUJIC8qMHhjOTQxICovCisjZGVmaW5lIFBDSV8wX0RFVkNTX0JPT1RfQkFOS19TSVpFCQkJUENJXzBDU19CT09UX0JBTktfU0laRQkvKjB4ZDE0MSAqLworI2RlZmluZSBQQ0lfMV9ERVZDU19CT09UX0JBTktfU0laRQkJCVBDSV8xQ1NfQk9PVF9CQU5LX1NJWkUJLyogMHhkOTQxICovCisjZGVmaW5lIFBDSV8wX1AyUF9NRU0wX0JBUl9TSVpFCQkJCSAgICBQQ0lfMFAyUF9NRU0wX0JBUl9TSVpFICAvKjB4ZDFjMSAqLworI2RlZmluZSBQQ0lfMV9QMlBfTUVNMF9CQVJfU0laRQkJCQkgICAgUENJXzFQMlBfTUVNMF9CQVJfU0laRSAgLyoweGQ5YzEgKi8KKyNkZWZpbmUgUENJXzBfUDJQX01FTTFfQkFSX1NJWkUJCQkJICAgIFBDSV8wUDJQX01FTTFfQkFSX1NJWkUgIC8qMHhkMjAxICovCisjZGVmaW5lIFBDSV8xX1AyUF9NRU0xX0JBUl9TSVpFCQkJCSAgICBQQ0lfMVAyUF9NRU0xX0JBUl9TSVpFICAvKjB4ZGEwMSAqLworI2RlZmluZSBQQ0lfMF9QMlBfSV9PX0JBUl9TSVpFCQkJCQlQQ0lfMFAyUF9JX09fQkFSX1NJWkUgIC8qMHhkMjQxICovCisjZGVmaW5lIFBDSV8xX1AyUF9JX09fQkFSX1NJWkUJCQkJCVBDSV8xUDJQX0lfT19CQVJfU0laRSAgLyoweGRhNDEgKi8KKyNkZWZpbmUgUENJXzBfQ1BVX0JBUl9TSVpFCQkJCQlQQ0lfMENQVV9CQVJfU0laRSAgLyoweGQyODEgKi8KKyNkZWZpbmUgUENJXzFfQ1BVX0JBUl9TSVpFCQkJCQlQQ0lfMUNQVV9CQVJfU0laRSAgLyoweGRhODEgKi8KKyNkZWZpbmUgUENJXzBfSU5URVJOQUxfU1JBTV9CQVJfU0laRQkJCVBDSV8wREFDX1NDU18wX0JBTktfU0laRSAgLyoweGUwMDEgKi8KKyNkZWZpbmUgUENJXzFfSU5URVJOQUxfU1JBTV9CQVJfU0laRQkJCVBDSV8xREFDX1NDU18wX0JBTktfU0laRSAgLyoweGU4MDEgKi8KKyNkZWZpbmUgUENJXzBfRVhQQU5TSU9OX1JPTV9CQVJfU0laRQkJCVBDSV8wRVhQQU5TSU9OX1JPTV9CQVJfU0laRSAgLyoweGQyYzEgKi8KKyNkZWZpbmUgUENJXzFfRVhQQU5TSU9OX1JPTV9CQVJfU0laRQkJICAgICAgIFBDSV8xRVhQQU5TSU9OX1JPTV9CQVJfU0laRSAgLyoweGQ5YzEgKi8KKyNkZWZpbmUgUENJXzBfQkFTRV9BRERSX1JFR19FTkFCTEUJCQlQQ0lfMEJBU0VfQUREUkVTU19SRUdJU1RFUlNfRU5BQkxFICAvKjB4YzNjMSAqLworI2RlZmluZSBQQ0lfMV9CQVNFX0FERFJfUkVHX0VOQUJMRQkJCVBDSV8xQkFTRV9BRERSRVNTX1JFR0lTVEVSU19FTkFCTEUgIC8qMHhjYmMxICovCisjZGVmaW5lIFBDSV8wX0NTXzBfQkFTRV9BRERSX1JFTUFQCQlQQ0lfMFNDU18wX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGM0ODEgKi8KKyNkZWZpbmUgUENJXzFfQ1NfMF9CQVNFX0FERFJfUkVNQVAJCVBDSV8xU0NTXzBfQkFTRV9BRERSRVNTX1JFTUFQICAvKjB4Y2M4MSAqLworI2RlZmluZSBQQ0lfMF9DU18xX0JBU0VfQUREUl9SRU1BUAkJUENJXzBTQ1NfMV9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhkNDgxICovCisjZGVmaW5lIFBDSV8xX0NTXzFfQkFTRV9BRERSX1JFTUFQCQlQQ0lfMVNDU18xX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGRjODEgKi8KKyNkZWZpbmUgUENJXzBfQ1NfMl9CQVNFX0FERFJfUkVNQVAJCVBDSV8wU0NTXzJfQkFTRV9BRERSRVNTX1JFTUFQICAvKjB4YzRjMSAqLworI2RlZmluZSBQQ0lfMV9DU18yX0JBU0VfQUREUl9SRU1BUAkJUENJXzFTQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhjY2MxICovCisjZGVmaW5lIFBDSV8wX0NTXzNfQkFTRV9BRERSX1JFTUFQCQlQQ0lfMFNDU18zX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGQ0YzEgKi8KKyNkZWZpbmUgUENJXzFfQ1NfM19CQVNFX0FERFJfUkVNQVAJCVBDSV8xU0NTXzNfQkFTRV9BRERSRVNTX1JFTUFQIC8qIDB4ZGNjMSAqLworI2RlZmluZSBQQ0lfMF9DU18wX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8wREFDX1NDU18wX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9DU18wX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8xREFDX1NDU18wX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9DU18xX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8wREFDX1NDU18xX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9DU18xX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8xREFDX1NDU18xX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9DU18yX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8wREFDX1NDU18yX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9DU18yX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8xREFDX1NDU18yX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9DU18zX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8wREFDX1NDU18zX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMV9DU18zX0JBU0VfSElHSF9BRERSX1JFTUFQIFBDSV8xREFDX1NDU18zX0JBU0VfQUREUkVTU19SRU1BUAorI2RlZmluZSBQQ0lfMF9ERVZDU18wX0JBU0VfQUREUl9SRU1BUAkJUENJXzBDU18wX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGM1MDEgKi8KKyNkZWZpbmUgUENJXzFfREVWQ1NfMF9CQVNFX0FERFJfUkVNQVAJCVBDSV8xQ1NfMF9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhjZDAxICovCisjZGVmaW5lIFBDSV8wX0RFVkNTXzFfQkFTRV9BRERSX1JFTUFQCQlQQ0lfMENTXzFfQkFTRV9BRERSRVNTX1JFTUFQICAvKjB4ZDUwMSAqLworI2RlZmluZSBQQ0lfMV9ERVZDU18xX0JBU0VfQUREUl9SRU1BUAkJUENJXzFDU18xX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGRkMDEgKi8KKyNkZWZpbmUgUENJXzBfREVWQ1NfMl9CQVNFX0FERFJfUkVNQVAJCVBDSV8wQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhkNTgxICovCisjZGVmaW5lIFBDSV8xX0RFVkNTXzJfQkFTRV9BRERSX1JFTUFQCQlQQ0lfMUNTXzJfQkFTRV9BRERSRVNTX1JFTUFQICAvKjB4ZGQ4MSAqLworI2RlZmluZSBQQ0lfMF9ERVZDU18zX0JBU0VfQUREUl9SRU1BUAkJCVBDSV8wQ1NfM19CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhjNTQxICovCisjZGVmaW5lIFBDSV8xX0RFVkNTXzNfQkFTRV9BRERSX1JFTUFQCQkJUENJXzFDU18zX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGNkNDEgKi8KKyNkZWZpbmUgUENJXzBfREVWQ1NfQk9PVENTX0JBU0VfQUREUl9SRU1BUCAgICBQQ0lfMENTX0JPT1RDU19CQVNFX0FERFJFU1NfUkVNQVAJIC8qMHhkNTQxICovCisjZGVmaW5lIFBDSV8xX0RFVkNTX0JPT1RDU19CQVNFX0FERFJfUkVNQVAgICAgUENJXzFDU19CT09UQ1NfQkFTRV9BRERSRVNTX1JFTUFQCSAvKjB4ZGQ0MSAqLworI2RlZmluZSBQQ0lfMF9QMlBfTUVNMF9CQVNFX0FERFJfUkVNQVBfTE9XICAgIFBDSV8wUDJQX01FTTBfQkFTRV9BRERSRVNTX1JFTUFQX0xPVyAgLyoweGQ1YzEgKi8KKyNkZWZpbmUgUENJXzFfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0xPVyAgICBQQ0lfMVAyUF9NRU0wX0JBU0VfQUREUkVTU19SRU1BUF9MT1cgIC8qMHhkZGMxICovCisjZGVmaW5lIFBDSV8wX1AyUF9NRU0wX0JBU0VfQUREUl9SRU1BUF9ISUdIICAgUENJXzBQMlBfTUVNMF9CQVNFX0FERFJFU1NfUkVNQVBfSElHSCAgLyoweGQ2MDEgKi8KKyNkZWZpbmUgUENJXzFfUDJQX01FTTBfQkFTRV9BRERSX1JFTUFQX0hJR0ggICBQQ0lfMVAyUF9NRU0wX0JBU0VfQUREUkVTU19SRU1BUF9ISUdIICAvKjB4ZGUwMSAqLworI2RlZmluZSBQQ0lfMF9QMlBfTUVNMV9CQVNFX0FERFJfUkVNQVBfTE9XCVBDSV8wUDJQX01FTTFfQkFTRV9BRERSRVNTX1JFTUFQX0xPVyAgLyoweGQ2NDEgKi8KKyNkZWZpbmUgUENJXzFfUDJQX01FTTFfQkFTRV9BRERSX1JFTUFQX0xPVwlQQ0lfMVAyUF9NRU0xX0JBU0VfQUREUkVTU19SRU1BUF9MT1cgIC8qMHhkZTQxICovCisjZGVmaW5lIFBDSV8wX1AyUF9NRU0xX0JBU0VfQUREUl9SRU1BUF9ISUdICVBDSV8wUDJQX01FTTFfQkFTRV9BRERSRVNTX1JFTUFQX0hJR0ggIC8qMHhkNjgxICovCisjZGVmaW5lIFBDSV8xX1AyUF9NRU0xX0JBU0VfQUREUl9SRU1BUF9ISUdICVBDSV8xUDJQX01FTTFfQkFTRV9BRERSRVNTX1JFTUFQX0hJR0ggIC8qMHhkZTgxICovCisjZGVmaW5lIFBDSV8wX1AyUF9JX09fQkFTRV9BRERSX1JFTUFQCQkJUENJXzBQMlBfSV9PX0JBU0VfQUREUkVTU19SRU1BUAkgLyoweGQ2YzEgKi8KKyNkZWZpbmUgUENJXzFfUDJQX0lfT19CQVNFX0FERFJfUkVNQVAJCQlQQ0lfMVAyUF9JX09fQkFTRV9BRERSRVNTX1JFTUFQCSAvKjB4ZGVjIDEgKi8KKyNkZWZpbmUgUENJXzBfQ1BVX0JBU0VfQUREUl9SRU1BUF9MT1cJCQlQQ0lfMENQVV9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhkNzAxICovCisjZGVmaW5lIFBDSV8xX0NQVV9CQVNFX0FERFJfUkVNQVBfTE9XCQkJUENJXzFDUFVfQkFTRV9BRERSRVNTX1JFTUFQICAvKjB4ZGYwMSAqLworI2RlZmluZSBQQ0lfMF9DUFVfQkFTRV9BRERSX1JFTUFQX0hJR0gJCQkweGQ3NAorI2RlZmluZSBQQ0lfMV9DUFVfQkFTRV9BRERSX1JFTUFQX0hJR0gJCQkweGRmNAorI2RlZmluZSBQQ0lfMF9JTlRFR1JBVEVEX1NSQU1fQkFTRV9BRERSX1JFTUFQCQkgIFBDSV8wREFDX1NDU18wX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGYwMDEgKi8KKyNkZWZpbmUgUENJXzFfSU5URUdSQVRFRF9TUkFNX0JBU0VfQUREUl9SRU1BUAkJICAweGY4MAorI2RlZmluZSBQQ0lfMF9FWFBBTlNJT05fUk9NX0JBU0VfQUREUl9SRU1BUAkJICAgUENJXzBFWFBBTlNJT05fUk9NX0JBU0VfQUREUkVTU19SRU1BUCAgLyoweGYzODEgKi8KKyNkZWZpbmUgUENJXzFfRVhQQU5TSU9OX1JPTV9CQVNFX0FERFJfUkVNQVAJCSAgIFBDSV8xRVhQQU5TSU9OX1JPTV9CQVNFX0FERFJFU1NfUkVNQVAgIC8qMHhmYjgxICovCisjZGVmaW5lIFBDSV8wX0FERFJfREVDT0RFX0NPTlRST0wJCQkJUENJXzBBRERSRVNTX0RFQ09ERV9DT05UUk9MICAvKjB4ZDNjMSAqLworI2RlZmluZSBQQ0lfMV9BRERSX0RFQ09ERV9DT05UUk9MCQkJCVBDSV8xQUREUkVTU19ERUNPREVfQ09OVFJPTCAgLyoweGRiYzEgKi8KKyNkZWZpbmUgUENJXzBfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJMHhGNDAKKyNkZWZpbmUgUENJXzFfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MCQkJCTB4RmMwCisjZGVmaW5lIFBDSV8wX0hFQURFUlNfUkVUQVJHRVRfQkFTRQkJCQkweEY0NAorI2RlZmluZSBQQ0lfMV9IRUFERVJTX1JFVEFSR0VUX0JBU0UJCQkJMHhGYzQKKyNkZWZpbmUgUENJXzBfSEVBREVSU19SRVRBUkdFVF9ISUdICQkJCTB4RjQ4CisjZGVmaW5lIFBDSV8xX0hFQURFUlNfUkVUQVJHRVRfSElHSAkJCQkweEZjOAorCisjZGVmaW5lIFBDSV8wU0NTXzBfQkFOS19TSVpFCQkJCTB4YzA4CisjZGVmaW5lIFBDSV8xU0NTXzBfQkFOS19TSVpFCQkJCTB4Yzg4CisjZGVmaW5lIFBDSV8wU0NTXzFfQkFOS19TSVpFCQkJCTB4ZDA4CisjZGVmaW5lIFBDSV8xU0NTXzFfQkFOS19TSVpFCQkJCTB4ZDg4CisjZGVmaW5lIFBDSV8wU0NTXzJfQkFOS19TSVpFCQkJCTB4YzBjCisjZGVmaW5lIFBDSV8xU0NTXzJfQkFOS19TSVpFCQkJCTB4YzhjCisjZGVmaW5lIFBDSV8wU0NTXzNfQkFOS19TSVpFCQkJCTB4ZDBjCisjZGVmaW5lIFBDSV8xU0NTXzNfQkFOS19TSVpFCQkJCTB4ZDhjCisjZGVmaW5lIFBDSV8wQ1NfMF9CQU5LX1NJWkUJCQkJMHhjMTAKKyNkZWZpbmUgUENJXzFDU18wX0JBTktfU0laRQkJCQkweGM5MAorI2RlZmluZSBQQ0lfMENTXzFfQkFOS19TSVpFCQkJCTB4ZDEwCisjZGVmaW5lIFBDSV8xQ1NfMV9CQU5LX1NJWkUJCQkJMHhkOTAKKyNkZWZpbmUgUENJXzBDU18yX0JBTktfU0laRQkJCQkweGQxOAorI2RlZmluZSBQQ0lfMUNTXzJfQkFOS19TSVpFCQkJCTB4ZDk4CisjZGVmaW5lIFBDSV8wQ1NfM19CQU5LX1NJWkUJCQkJMHhjMTQKKyNkZWZpbmUgUENJXzFDU18zX0JBTktfU0laRQkJCQkweGM5NAorI2RlZmluZSBQQ0lfMENTX0JPT1RfQkFOS19TSVpFCQkJCTB4ZDE0CisjZGVmaW5lIFBDSV8xQ1NfQk9PVF9CQU5LX1NJWkUJCQkJMHhkOTQKKyNkZWZpbmUgUENJXzBQMlBfTUVNMF9CQVJfU0laRQkJCQkJCTB4ZDFjCisjZGVmaW5lIFBDSV8xUDJQX01FTTBfQkFSX1NJWkUJCQkJCQkweGQ5YworI2RlZmluZSBQQ0lfMFAyUF9NRU0xX0JBUl9TSVpFCQkJCQkJMHhkMjAKKyNkZWZpbmUgUENJXzFQMlBfTUVNMV9CQVJfU0laRQkJCQkJCTB4ZGEwCisjZGVmaW5lIFBDSV8wUDJQX0lfT19CQVJfU0laRQkJCQkJCTB4ZDI0CisjZGVmaW5lIFBDSV8xUDJQX0lfT19CQVJfU0laRQkJCQkJCTB4ZGE0CisjZGVmaW5lIFBDSV8wQ1BVX0JBUl9TSVpFCQkJCQkJMHhkMjgKKyNkZWZpbmUgUENJXzFDUFVfQkFSX1NJWkUJCQkJCQkweGRhOAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfMF9CQU5LX1NJWkUJCQkJMHhlMDAKKyNkZWZpbmUgUENJXzFEQUNfU0NTXzBfQkFOS19TSVpFCQkJCTB4ZTgwCisjZGVmaW5lIFBDSV8wREFDX1NDU18xX0JBTktfU0laRQkJCQkweGUwNAorI2RlZmluZSBQQ0lfMURBQ19TQ1NfMV9CQU5LX1NJWkUJCQkJMHhlODQKKyNkZWZpbmUgUENJXzBEQUNfU0NTXzJfQkFOS19TSVpFCQkJCTB4ZTA4CisjZGVmaW5lIFBDSV8xREFDX1NDU18yX0JBTktfU0laRQkJCQkweGU4OAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfM19CQU5LX1NJWkUJCQkJMHhlMGMKKyNkZWZpbmUgUENJXzFEQUNfU0NTXzNfQkFOS19TSVpFCQkJCTB4ZThjCisjZGVmaW5lIFBDSV8wREFDX0NTXzBfQkFOS19TSVpFCQkJCQkweGUxMAorI2RlZmluZSBQQ0lfMURBQ19DU18wX0JBTktfU0laRQkJCQkJMHhlOTAKKyNkZWZpbmUgUENJXzBEQUNfQ1NfMV9CQU5LX1NJWkUJCQkJCTB4ZTE0CisjZGVmaW5lIFBDSV8xREFDX0NTXzFfQkFOS19TSVpFCQkJCQkweGU5NAorI2RlZmluZSBQQ0lfMERBQ19DU18yX0JBTktfU0laRQkJCQkJMHhlMTgKKyNkZWZpbmUgUENJXzFEQUNfQ1NfMl9CQU5LX1NJWkUJCQkJCTB4ZTk4CisjZGVmaW5lIFBDSV8wREFDX0NTXzNfQkFOS19TSVpFCQkJCQkweGUxYworI2RlZmluZSBQQ0lfMURBQ19DU18zX0JBTktfU0laRQkJCQkJMHhlOWMKKyNkZWZpbmUgUENJXzBEQUNfQk9PVENTX0JBTktfU0laRQkJCQkweGUyMAorI2RlZmluZSBQQ0lfMURBQ19CT09UQ1NfQkFOS19TSVpFCQkJCTB4ZWEwCisKKyNkZWZpbmUgUENJXzBEQUNfUDJQX01FTTBfQkFSX1NJWkUJCQkJMHhlMjQKKyNkZWZpbmUgUENJXzFEQUNfUDJQX01FTTBfQkFSX1NJWkUJCQkJMHhlYTQKKyNkZWZpbmUgUENJXzBEQUNfUDJQX01FTTFfQkFSX1NJWkUJCQkJMHhlMjgKKyNkZWZpbmUgUENJXzFEQUNfUDJQX01FTTFfQkFSX1NJWkUJCQkJMHhlYTgKKyNkZWZpbmUgUENJXzBEQUNfQ1BVX0JBUl9TSVpFCQkJCQkJMHhlMmMKKyNkZWZpbmUgUENJXzFEQUNfQ1BVX0JBUl9TSVpFCQkJCQkJMHhlYWMKKyNkZWZpbmUgUENJXzBFWFBBTlNJT05fUk9NX0JBUl9TSVpFCQkJCTB4ZDJjCisjZGVmaW5lIFBDSV8xRVhQQU5TSU9OX1JPTV9CQVJfU0laRQkJCQkweGRhYworI2RlZmluZSBQQ0lfMEJBU0VfQUREUkVTU19SRUdJU1RFUlNfRU5BQkxFCQkweGMzYworI2RlZmluZSBQQ0lfMUJBU0VfQUREUkVTU19SRUdJU1RFUlNfRU5BQkxFCQkweGNiYworI2RlZmluZSBQQ0lfMFNDU18wX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4YzQ4CisjZGVmaW5lIFBDSV8xU0NTXzBfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhjYzgKKyNkZWZpbmUgUENJXzBTQ1NfMV9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGQ0OAorI2RlZmluZSBQQ0lfMVNDU18xX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZGM4CisjZGVmaW5lIFBDSV8wU0NTXzJfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhjNGMKKyNkZWZpbmUgUENJXzFTQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGNjYworI2RlZmluZSBQQ0lfMFNDU18zX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZDRjCisjZGVmaW5lIFBDSV8xU0NTXzNfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhkY2MKKyNkZWZpbmUgUENJXzBDU18wX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4YzUwCisjZGVmaW5lIFBDSV8xQ1NfMF9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGNkMAorI2RlZmluZSBQQ0lfMENTXzFfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhkNTAKKyNkZWZpbmUgUENJXzFDU18xX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZGQwCisjZGVmaW5lIFBDSV8wQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGQ1OAorI2RlZmluZSBQQ0lfMUNTXzJfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhkZDgKKyNkZWZpbmUgUENJXzBDU18zX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4YzU0CisjZGVmaW5lIFBDSV8xQ1NfM19CQVNFX0FERFJFU1NfUkVNQVAJCQkweGNkNAorI2RlZmluZSBQQ0lfMENTX0JPT1RDU19CQVNFX0FERFJFU1NfUkVNQVAJMHhkNTQKKyNkZWZpbmUgUENJXzFDU19CT09UQ1NfQkFTRV9BRERSRVNTX1JFTUFQCTB4ZGQ0CisjZGVmaW5lIFBDSV8wUDJQX01FTTBfQkFTRV9BRERSRVNTX1JFTUFQX0xPVwkJCTB4ZDVjCisjZGVmaW5lIFBDSV8xUDJQX01FTTBfQkFTRV9BRERSRVNTX1JFTUFQX0xPVwkJICAweGRkYworI2RlZmluZSBQQ0lfMFAyUF9NRU0wX0JBU0VfQUREUkVTU19SRU1BUF9ISUdICQkgIDB4ZDYwCisjZGVmaW5lIFBDSV8xUDJQX01FTTBfQkFTRV9BRERSRVNTX1JFTUFQX0hJR0gJCSAgMHhkZTAKKyNkZWZpbmUgUENJXzBQMlBfTUVNMV9CQVNFX0FERFJFU1NfUkVNQVBfTE9XCQkgMHhkNjQKKyNkZWZpbmUgUENJXzFQMlBfTUVNMV9CQVNFX0FERFJFU1NfUkVNQVBfTE9XCQkgMHhkZTQKKyNkZWZpbmUgUENJXzBQMlBfTUVNMV9CQVNFX0FERFJFU1NfUkVNQVBfSElHSAkJIDB4ZDY4CisjZGVmaW5lIFBDSV8xUDJQX01FTTFfQkFTRV9BRERSRVNTX1JFTUFQX0hJR0gJCSAweGRlOAorI2RlZmluZSBQQ0lfMFAyUF9JX09fQkFTRV9BRERSRVNTX1JFTUFQCQkJCTB4ZDZjCisjZGVmaW5lIFBDSV8xUDJQX0lfT19CQVNFX0FERFJFU1NfUkVNQVAJCQkJMHhkZWMKKyNkZWZpbmUgUENJXzBDUFVfQkFTRV9BRERSRVNTX1JFTUFQCQkJCTB4ZDcwCisjZGVmaW5lIFBDSV8xQ1BVX0JBU0VfQUREUkVTU19SRU1BUAkJCQkweGRmMAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfMF9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGYwMAorI2RlZmluZSBQQ0lfMURBQ19TQ1NfMF9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGZmMAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfMV9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGYwNAorI2RlZmluZSBQQ0lfMURBQ19TQ1NfMV9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGY4NAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGYwOAorI2RlZmluZSBQQ0lfMURBQ19TQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGY4OAorI2RlZmluZSBQQ0lfMERBQ19TQ1NfM19CQVNFX0FERFJFU1NfUkVNQVAJCQkweGYwYworI2RlZmluZSBQQ0lfMURBQ19TQ1NfM19CQVNFX0FERFJFU1NfUkVNQVAJCQkweGY4YworI2RlZmluZSBQQ0lfMERBQ19DU18wX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZjEwCisjZGVmaW5lIFBDSV8xREFDX0NTXzBfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhmOTAKKyNkZWZpbmUgUENJXzBEQUNfQ1NfMV9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGYxNAorI2RlZmluZSBQQ0lfMURBQ19DU18xX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4Zjk0CisjZGVmaW5lIFBDSV8wREFDX0NTXzJfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhmMTgKKyNkZWZpbmUgUENJXzFEQUNfQ1NfMl9CQVNFX0FERFJFU1NfUkVNQVAJCQkweGY5OAorI2RlZmluZSBQQ0lfMERBQ19DU18zX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZjFjCisjZGVmaW5lIFBDSV8xREFDX0NTXzNfQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhmOWMKKyNkZWZpbmUgUENJXzBEQUNfQk9PVENTX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZjIwCisjZGVmaW5lIFBDSV8xREFDX0JPT1RDU19CQVNFX0FERFJFU1NfUkVNQVAJCSAgICAweGZhMAorI2RlZmluZSBQQ0lfMERBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfUkVNQVBfTE9XICAgICAweGYyNAorI2RlZmluZSBQQ0lfMURBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfUkVNQVBfTE9XICAgICAweGZhNAorI2RlZmluZSBQQ0lfMERBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfUkVNQVBfSElHSCAgICAweGYyOAorI2RlZmluZSBQQ0lfMURBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfUkVNQVBfSElHSCAgICAweGZhOAorI2RlZmluZSBQQ0lfMERBQ19QMlBfTUVNMV9CQVNFX0FERFJFU1NfUkVNQVBfTE9XCTB4ZjJjCisjZGVmaW5lIFBDSV8xREFDX1AyUF9NRU0xX0JBU0VfQUREUkVTU19SRU1BUF9MT1cgICAgIDB4ZmFjCisjZGVmaW5lIFBDSV8wREFDX1AyUF9NRU0xX0JBU0VfQUREUkVTU19SRU1BUF9ISUdIICAgIDB4ZjMwCisjZGVmaW5lIFBDSV8xREFDX1AyUF9NRU0xX0JBU0VfQUREUkVTU19SRU1BUF9ISUdIICAgIDB4ZmIwCisjZGVmaW5lIFBDSV8wREFDX0NQVV9CQVNFX0FERFJFU1NfUkVNQVAJCQkJMHhmMzQKKyNkZWZpbmUgUENJXzFEQUNfQ1BVX0JBU0VfQUREUkVTU19SRU1BUAkJCQkweGZiNAorI2RlZmluZSBQQ0lfMEVYUEFOU0lPTl9ST01fQkFTRV9BRERSRVNTX1JFTUFQCQkJMHhmMzgKKyNkZWZpbmUgUENJXzFFWFBBTlNJT05fUk9NX0JBU0VfQUREUkVTU19SRU1BUAkJCTB4ZmI4CisjZGVmaW5lIFBDSV8wQUREUkVTU19ERUNPREVfQ09OVFJPTAkJCQkweGQzYworI2RlZmluZSBQQ0lfMUFERFJFU1NfREVDT0RFX0NPTlRST0wJCQkJMHhkYmMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgQ29udHJvbAkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJXzBDT01NQU5ECQkJCQkJCQkJCTB4YzAwCisjZGVmaW5lIFBDSV8xQ09NTUFORAkJCQkJCQkJCQkweGM4MAorI2RlZmluZSBQQ0lfME1PREUJCQkJCSAgICAweGQwMAorI2RlZmluZSBQQ0lfMU1PREUJCQkJCSAgICAweGQ4MAorI2RlZmluZSBQQ0lfMFRJTUVPVVRfUkVUUlkJCQkJCQkJCQkweGMwNAorI2RlZmluZSBQQ0lfMVRJTUVPVVRfUkVUUlkJCQkJCQkJCQkweGM4NAorI2RlZmluZSBQQ0lfMFJFQURfQlVGRkVSX0RJU0NBUkRfVElNRVIJCQkgICAgMHhkMDQKKyNkZWZpbmUgUENJXzFSRUFEX0JVRkZFUl9ESVNDQVJEX1RJTUVSCQkJICAgIDB4ZDg0CisjZGVmaW5lIE1TSV8wVFJJR0dFUl9USU1FUgkJCQkgICAgMHhjMzgKKyNkZWZpbmUgTVNJXzFUUklHR0VSX1RJTUVSCQkJCSAgICAweGNiOAorI2RlZmluZSBQQ0lfMEFSQklURVJfQ09OVFJPTAkJCQkgICAgMHgxZDAwCisjZGVmaW5lIFBDSV8xQVJCSVRFUl9DT05UUk9MCQkJCSAgICAweDFkODAKKy8qIGNoYW5naW5nIHVudGlsbCBoZXJlICovCisjZGVmaW5lIFBDSV8wQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkJICAgICAweDFkMDgKKyNkZWZpbmUgUENJXzBDUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgICAweDFkMGMKKyNkZWZpbmUgUENJXzBDUk9TU19CQVJfVElNRU9VVAkJCQkgICAgIDB4MWQwNAorI2RlZmluZSBQQ0lfMFJFQURfUkVTUE9OU0VfQ1JPU1NfQkFSX0NPTlRST0xfTE9XCSAgICAgMHgxZDE4CisjZGVmaW5lIFBDSV8wUkVBRF9SRVNQT05TRV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICSAgICAgMHgxZDFjCisjZGVmaW5lIFBDSV8wU1lOQ19CQVJSSUVSX1ZJUlRVQUxfUkVHSVNURVIJCSAgICAgMHgxZDEwCisjZGVmaW5lIFBDSV8wUDJQX0NPTkZJR1VSQVRJT04JCQkJICAgICAweDFkMTQKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCQkJICAgICAweDFlMDAKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzBfSElHSAkJCSAgICAgMHgxZTA0CisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfVE9QXzAJCQkgICAgIDB4MWUwOAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfMV9MT1cJCQkgICAgIDB4MWUxMAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfMV9ISUdICQkJICAgICAweDFlMTQKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9UT1BfMQkJCSAgICAgMHgxZTE4CisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfQkFTRV8yX0xPVwkJCSAgICAgMHgxZTIwCisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfQkFTRV8yX0hJR0gJCQkgICAgIDB4MWUyNAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX1RPUF8yCQkJICAgICAweDFlMjgKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzNfTE9XCQkJICAgICAweDFlMzAKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzNfSElHSAkJCSAgICAgMHgxZTM0CisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfVE9QXzMJCQkgICAgIDB4MWUzOAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfNF9MT1cJCQkgICAgIDB4MWU0MAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfNF9ISUdICQkJICAgICAweDFlNDQKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9UT1BfNAkJCSAgICAgMHgxZTQ4CisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfQkFTRV81X0xPVwkJCSAgICAgMHgxZTUwCisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfQkFTRV81X0hJR0gJCQkgICAgIDB4MWU1NAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX1RPUF81CQkJICAgICAweDFlNTgKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzZfTE9XCQkJICAgICAweDFlNjAKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9CQVNFXzZfSElHSAkJCSAgICAgMHgxZTY0CisjZGVmaW5lIFBDSV8wQUNDRVNTX0NPTlRST0xfVE9QXzYJCQkgICAgIDB4MWU2OAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfN19MT1cJCQkgICAgIDB4MWU3MAorI2RlZmluZSBQQ0lfMEFDQ0VTU19DT05UUk9MX0JBU0VfN19ISUdICQkJICAgICAweDFlNzQKKyNkZWZpbmUgUENJXzBBQ0NFU1NfQ09OVFJPTF9UT1BfNwkJCSAgICAgMHgxZTc4CisjZGVmaW5lIFBDSV8xQ1JPU1NfQkFSX0NPTlRST0xfTE9XCQkJICAgICAweDFkODgKKyNkZWZpbmUgUENJXzFDUk9TU19CQVJfQ09OVFJPTF9ISUdICQkJICAgICAweDFkOGMKKyNkZWZpbmUgUENJXzFDUk9TU19CQVJfVElNRU9VVAkJCQkgICAgIDB4MWQ4NAorI2RlZmluZSBQQ0lfMVJFQURfUkVTUE9OU0VfQ1JPU1NfQkFSX0NPTlRST0xfTE9XCSAgICAgMHgxZDk4CisjZGVmaW5lIFBDSV8xUkVBRF9SRVNQT05TRV9DUk9TU19CQVJfQ09OVFJPTF9ISUdICSAgICAgMHgxZDljCisjZGVmaW5lIFBDSV8xU1lOQ19CQVJSSUVSX1ZJUlRVQUxfUkVHSVNURVIJCSAgICAgMHgxZDkwCisjZGVmaW5lIFBDSV8xUDJQX0NPTkZJR1VSQVRJT04JCQkJICAgICAweDFkOTQKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCQkJICAgICAweDFlODAKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzBfSElHSAkJCSAgICAgMHgxZTg0CisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfVE9QXzAJCQkgICAgIDB4MWU4OAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfMV9MT1cJCQkgICAgIDB4MWU5MAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfMV9ISUdICQkJICAgICAweDFlOTQKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9UT1BfMQkJCSAgICAgMHgxZTk4CisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV8yX0xPVwkJCSAgICAgMHgxZWEwCisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV8yX0hJR0gJCQkgICAgIDB4MWVhNAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX1RPUF8yCQkJICAgICAweDFlYTgKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzNfTE9XCQkJICAgICAweDFlYjAKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzNfSElHSAkJCSAgICAgMHgxZWI0CisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfVE9QXzMJCQkgICAgIDB4MWViOAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfNF9MT1cJCQkgICAgIDB4MWVjMAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfNF9ISUdICQkJICAgICAweDFlYzQKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9UT1BfNAkJCSAgICAgMHgxZWM4CisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV81X0xPVwkJCSAgICAgMHgxZWQwCisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfQkFTRV81X0hJR0gJCQkgICAgIDB4MWVkNAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX1RPUF81CQkJICAgICAweDFlZDgKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzZfTE9XCQkJICAgICAweDFlZTAKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9CQVNFXzZfSElHSAkJCSAgICAgMHgxZWU0CisjZGVmaW5lIFBDSV8xQUNDRVNTX0NPTlRST0xfVE9QXzYJCQkgICAgIDB4MWVlOAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfN19MT1cJCQkgICAgIDB4MWVmMAorI2RlZmluZSBQQ0lfMUFDQ0VTU19DT05UUk9MX0JBU0VfN19ISUdICQkJICAgICAweDFlZjQKKyNkZWZpbmUgUENJXzFBQ0NFU1NfQ09OVFJPTF9UT1BfNwkJCSAgICAgMHgxZWY4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIFNub29wIENvbnRyb2wJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJXzBTTk9PUF9DT05UUk9MX0JBU0VfMF9MT1cJCQkgICAgIDB4MWYwMAorI2RlZmluZSBQQ0lfMFNOT09QX0NPTlRST0xfQkFTRV8wX0hJR0gJCQkgICAgIDB4MWYwNAorI2RlZmluZSBQQ0lfMFNOT09QX0NPTlRST0xfVE9QXzAJCQkgICAgIDB4MWYwOAorI2RlZmluZSBQQ0lfMFNOT09QX0NPTlRST0xfQkFTRV8xXzBfTE9XCQkJICAgICAweDFmMTAKKyNkZWZpbmUgUENJXzBTTk9PUF9DT05UUk9MX0JBU0VfMV8wX0hJR0gJCSAgICAgMHgxZjE0CisjZGVmaW5lIFBDSV8wU05PT1BfQ09OVFJPTF9UT1BfMQkJCSAgICAgMHgxZjE4CisjZGVmaW5lIFBDSV8wU05PT1BfQ09OVFJPTF9CQVNFXzJfMF9MT1cJCQkgICAgIDB4MWYyMAorI2RlZmluZSBQQ0lfMFNOT09QX0NPTlRST0xfQkFTRV8yXzBfSElHSAkJICAgICAweDFmMjQKKyNkZWZpbmUgUENJXzBTTk9PUF9DT05UUk9MX1RPUF8yCQkJICAgICAweDFmMjgKKyNkZWZpbmUgUENJXzBTTk9PUF9DT05UUk9MX0JBU0VfM18wX0xPVwkJCSAgICAgMHgxZjMwCisjZGVmaW5lIFBDSV8wU05PT1BfQ09OVFJPTF9CQVNFXzNfMF9ISUdICQkgICAgIDB4MWYzNAorI2RlZmluZSBQQ0lfMFNOT09QX0NPTlRST0xfVE9QXzMJCQkgICAgIDB4MWYzOAorI2RlZmluZSBQQ0lfMVNOT09QX0NPTlRST0xfQkFTRV8wX0xPVwkJCSAgICAgMHgxZjgwCisjZGVmaW5lIFBDSV8xU05PT1BfQ09OVFJPTF9CQVNFXzBfSElHSAkJCSAgICAgMHgxZjg0CisjZGVmaW5lIFBDSV8xU05PT1BfQ09OVFJPTF9UT1BfMAkJCSAgICAgMHgxZjg4CisjZGVmaW5lIFBDSV8xU05PT1BfQ09OVFJPTF9CQVNFXzFfMF9MT1cJCQkgICAgIDB4MWY5MAorI2RlZmluZSBQQ0lfMVNOT09QX0NPTlRST0xfQkFTRV8xXzBfSElHSAkJICAgICAweDFmOTQKKyNkZWZpbmUgUENJXzFTTk9PUF9DT05UUk9MX1RPUF8xCQkJICAgICAweDFmOTgKKyNkZWZpbmUgUENJXzFTTk9PUF9DT05UUk9MX0JBU0VfMl8wX0xPVwkJCSAgICAgMHgxZmEwCisjZGVmaW5lIFBDSV8xU05PT1BfQ09OVFJPTF9CQVNFXzJfMF9ISUdICQkgICAgIDB4MWZhNAorI2RlZmluZSBQQ0lfMVNOT09QX0NPTlRST0xfVE9QXzIJCQkgICAgIDB4MWZhOAorI2RlZmluZSBQQ0lfMVNOT09QX0NPTlRST0xfQkFTRV8zXzBfTE9XCQkJICAgICAweDFmYjAKKyNkZWZpbmUgUENJXzFTTk9PUF9DT05UUk9MX0JBU0VfM18wX0hJR0gJCSAgICAgMHgxZmI0CisjZGVmaW5lIFBDSV8xU05PT1BfQ09OVFJPTF9UT1BfMwkJCSAgICAgMHgxZmI4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIENvbmZpZ3VyYXRpb24gQWRkcmVzcwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBDSV8wQ09ORklHVVJBVElPTl9BRERSRVNTCQkJCQkJCTB4Y2Y4CisjZGVmaW5lIFBDSV8wQ09ORklHVVJBVElPTl9EQVRBX1ZJUlRVQUxfUkVHSVNURVIJCTB4Y2ZjCisjZGVmaW5lIFBDSV8xQ09ORklHVVJBVElPTl9BRERSRVNTCQkJCQkJCTB4Yzc4CisjZGVmaW5lIFBDSV8xQ09ORklHVVJBVElPTl9EQVRBX1ZJUlRVQUxfUkVHSVNURVIJCTB4YzdjCisjZGVmaW5lIFBDSV8wSU5URVJSVVBUX0FDS05PV0xFREdFX1ZJUlRVQUxfUkVHSVNURVIJCQkweGMzNAorI2RlZmluZSBQQ0lfMUlOVEVSUlVQVF9BQ0tOT1dMRURHRV9WSVJUVUFMX1JFR0lTVEVSCQkJMHhjYjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgRXJyb3IgUmVwb3J0CQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBDSV8wU0VSUl9NQVNLCQkJCQkJCQkJCSAweGMyOAorI2RlZmluZSBQQ0lfMEVSUk9SX0FERFJFU1NfTE9XCQkJCSAgICAgMHgxZDQwCisjZGVmaW5lIFBDSV8wRVJST1JfQUREUkVTU19ISUdICQkJCSAgICAgMHgxZDQ0CisjZGVmaW5lIFBDSV8wRVJST1JfREFUQV9MT1cJCQkJICAgICAweDFkNDgKKyNkZWZpbmUgUENJXzBFUlJPUl9EQVRBX0hJR0gJCQkJICAgICAweDFkNGMKKyNkZWZpbmUgUENJXzBFUlJPUl9DT01NQU5ECQkJCSAgICAgMHgxZDUwCisjZGVmaW5lIFBDSV8wRVJST1JfQ0FVU0UJCQkJICAgICAweDFkNTgKKyNkZWZpbmUgUENJXzBFUlJPUl9NQVNLCQkJCQkgICAgIDB4MWQ1YworI2RlZmluZSBQQ0lfMVNFUlJfTUFTSwkJCQkJCQkJCQkgMHhjYTgKKyNkZWZpbmUgUENJXzFFUlJPUl9BRERSRVNTX0xPVwkJCQkgICAgIDB4MWRjMAorI2RlZmluZSBQQ0lfMUVSUk9SX0FERFJFU1NfSElHSAkJCQkgICAgIDB4MWRjNAorI2RlZmluZSBQQ0lfMUVSUk9SX0RBVEFfTE9XCQkJCSAgICAgMHgxZGM4CisjZGVmaW5lIFBDSV8xRVJST1JfREFUQV9ISUdICQkJCSAgICAgMHgxZGNjCisjZGVmaW5lIFBDSV8xRVJST1JfQ09NTUFORAkJCQkgICAgIDB4MWRkMAorI2RlZmluZSBQQ0lfMUVSUk9SX0NBVVNFCQkJCSAgICAgMHgxZGQ4CisjZGVmaW5lIFBDSV8xRVJST1JfTUFTSwkJCQkJICAgICAweDFkZGMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIExzbGF2ZSBEZWJ1ZwkgKGZvciBpbnRlcm5hbCB1c2UpCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMX1NMQVZFX1gwX0FERFJFU1MJCQkJICAgIDB4MWQyMAorI2RlZmluZSBMX1NMQVZFX1gwX0NPTU1BTkRfQU5EX0lECQkJICAgIDB4MWQyNAorI2RlZmluZSBMX1NMQVZFX1gxX0FERFJFU1MJCQkJICAgIDB4MWQyOAorI2RlZmluZSBMX1NMQVZFX1gxX0NPTU1BTkRfQU5EX0lECQkJICAgIDB4MWQyYworI2RlZmluZSBMX1NMQVZFX1dSSVRFX0RBVEFfTE9XCQkJCSAgICAweDFkMzAKKyNkZWZpbmUgTF9TTEFWRV9XUklURV9EQVRBX0hJR0gJCQkJICAgIDB4MWQzNAorI2RlZmluZSBMX1NMQVZFX1dSSVRFX0JZVEVfRU5BQkxFCQkJICAgIDB4MWQ2MAorI2RlZmluZSBMX1NMQVZFX1JFQURfREFUQV9MT1cJCQkJICAgIDB4MWQzOAorI2RlZmluZSBMX1NMQVZFX1JFQURfREFUQV9ISUdICQkJCSAgICAweDFkM2MKKyNkZWZpbmUgTF9TTEFWRV9SRUFEX0lECQkJCQkgICAgMHgxZDY0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIENvbmZpZ3VyYXRpb24gRnVuY3Rpb24gMAkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBDSV9ERVZJQ0VfQU5EX1ZFTkRPUl9JRAkJCQkJCQkweDAwMAorI2RlZmluZSBQQ0lfU1RBVFVTX0FORF9DT01NQU5ECQkJCQkJCQkweDAwNAorI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERV9BTkRfUkVWSVNJT05fSUQJCQkJCTB4MDA4CisjZGVmaW5lIFBDSV9CSVNUX0hFQURFUl9UWVBFX0xBVEVOQ1lfVElNRVJfQ0FDSEVfTElORQkJMHgwMEMKKyNkZWZpbmUgUENJX1NDU18wX0JBU0VfQUREUkVTUwkJCQkJCQkweDAxMAorI2RlZmluZSBQQ0lfU0NTXzFfQkFTRV9BRERSRVNTCQkJCQkJCSAgICAweDAxNAorI2RlZmluZSBQQ0lfU0NTXzJfQkFTRV9BRERSRVNTCQkJCQkJCSAgICAweDAxOAorI2RlZmluZSBQQ0lfU0NTXzNfQkFTRV9BRERSRVNTCQkJCQkJCTB4MDFDCisjZGVmaW5lIFBDSV9JTlRFUk5BTF9SRUdJU1RFUlNfTUVNT1JZX01BUFBFRF9CQVNFX0FERFJFU1MJMHgwMjAKKyNkZWZpbmUgUENJX0lOVEVSTkFMX1JFR0lTVEVSU19JX09NQVBQRURfQkFTRV9BRERSRVNTCQkweDAyNAorI2RlZmluZSBQQ0lfU1VCU1lTVEVNX0lEX0FORF9TVUJTWVNURU1fVkVORE9SX0lECQkJMHgwMkMKKyNkZWZpbmUgUENJX0VYUEFOU0lPTl9ST01fQkFTRV9BRERSRVNTX1JFR0lTVEVSCQkJCTB4MDMwCisjZGVmaW5lIFBDSV9DQVBBQklMVFlfTElTVF9QT0lOVEVSCQkJICAgIDB4MDM0CisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOX0FORF9MSU5FCQkJCQkJICAgIDB4MDNDCisjZGVmaW5lIFBDSV9QT1dFUl9NQU5BR0VNRU5UX0NBUEFCSUxJVFkJCQkgICAgMHgwNDAKKyNkZWZpbmUgUENJX1BPV0VSX01BTkFHRU1FTlRfU1RBVFVTX0FORF9DT05UUk9MCQkgICAgMHgwNDQKKyNkZWZpbmUgUENJX1ZQRF9BRERSRVNTCQkJCQkgICAgMHgwNDgKKyNkZWZpbmUgUENJX1ZQRF9EQVRBCQkJCQkgICAgMHgwNGMKKyNkZWZpbmUgUENJX01TSV9NRVNTQUdFX0NPTlRST0wJCQkJICAgIDB4MDUwCisjZGVmaW5lIFBDSV9NU0lfTUVTU0FHRV9BRERSRVNTCQkJCSAgICAweDA1NAorI2RlZmluZSBQQ0lfTVNJX01FU1NBR0VfVVBQRVJfQUREUkVTUwkJCSAgICAweDA1OAorI2RlZmluZSBQQ0lfTVNJX01FU1NBR0VfREFUQQkJCQkgICAgMHgwNWMKKyNkZWZpbmUgUENJX0NPTVBBQ1RfUENJX0hPVF9TV0FQX0NBUEFCSUxJVFkJCSAgICAweDA1OAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBDb25maWd1cmF0aW9uIEZ1bmN0aW9uIDEJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfQ1NfMF9CQVNFX0FERFJFU1MJCQkJCQkJMHgxMTAKKyNkZWZpbmUgUENJX0NTXzFfQkFTRV9BRERSRVNTCQkJCQkJCSAgICAweDExNAorI2RlZmluZSBQQ0lfQ1NfMl9CQVNFX0FERFJFU1MJCQkJCQkJICAgIDB4MTE4CisjZGVmaW5lIFBDSV9DU18zX0JBU0VfQUREUkVTUwkJCQkJCQkweDExYworI2RlZmluZSBQQ0lfQk9PVENTX0JBU0VfQUREUkVTUwkJCQkgICAgMHgxMjAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgQ29uZmlndXJhdGlvbiBGdW5jdGlvbiAyCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX1AyUF9NRU0wX0JBU0VfQUREUkVTUwkJCQkJCTB4MjEwCisgLyojZGVmaW5lIFBDSV9QMlBfTUVNMV9CQVNFX0FERFJFU1MJCQkJCQkJMHgyMTQxICovCisjZGVmaW5lIFBDSV9QMlBfSV9PX0JBU0VfQUREUkVTUwkJCQkJCQkweDIxOAorIC8qI2RlZmluZSBQQ0lfQ1BVX0JBU0VfQUREUkVTUwkJCQkJCQkgICAgMHgyMWMxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIENvbmZpZ3VyYXRpb24gRnVuY3Rpb24gNAkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBDSV9EQUNfU0NTXzBfQkFTRV9BRERSRVNTX0xPVwkJCQkJCTB4NDEwCisjZGVmaW5lIFBDSV9EQUNfU0NTXzBfQkFTRV9BRERSRVNTX0hJR0gJCQkJCSAgICAweDQxNAorI2RlZmluZSBQQ0lfREFDX1NDU18xX0JBU0VfQUREUkVTU19MT1cJCQkJCSAgICAweDQxOAorI2RlZmluZSBQQ0lfREFDX1NDU18xX0JBU0VfQUREUkVTU19ISUdICQkJCQkgICAgMHg0MWMKKyNkZWZpbmUgUENJX0RBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfTE9XCQkgICAgMHg0MjAKKyNkZWZpbmUgUENJX0RBQ19QMlBfTUVNMF9CQVNFX0FERFJFU1NfSElHSAkJICAgIDB4NDI0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgQ29uZmlndXJhdGlvbiBGdW5jdGlvbiA1CQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX0RBQ19TQ1NfMl9CQVNFX0FERFJFU1NfTE9XCQkJCQkJMHg1MTAKKyNkZWZpbmUgUENJX0RBQ19TQ1NfMl9CQVNFX0FERFJFU1NfSElHSAkJCQkJICAgIDB4NTE0CisjZGVmaW5lIFBDSV9EQUNfU0NTXzNfQkFTRV9BRERSRVNTX0xPVwkJCQkJICAgIDB4NTE4CisjZGVmaW5lIFBDSV9EQUNfU0NTXzNfQkFTRV9BRERSRVNTX0hJR0gJCQkJCSAgICAweDUxYworI2RlZmluZSBQQ0lfREFDX1AyUF9NRU0xX0JBU0VfQUREUkVTU19MT1cJCSAgICAweDUyMAorI2RlZmluZSBQQ0lfREFDX1AyUF9NRU0xX0JBU0VfQUREUkVTU19ISUdICQkgICAgMHg1MjQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBDb25maWd1cmF0aW9uIEZ1bmN0aW9uIDYJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfREFDX0NTXzBfQkFTRV9BRERSRVNTX0xPVwkJCQkJCTB4NjEwCisjZGVmaW5lIFBDSV9EQUNfQ1NfMF9CQVNFX0FERFJFU1NfSElHSAkJCQkJICAgIDB4NjE0CisjZGVmaW5lIFBDSV9EQUNfQ1NfMV9CQVNFX0FERFJFU1NfTE9XCQkJCQkgICAgMHg2MTgKKyNkZWZpbmUgUENJX0RBQ19DU18xX0JBU0VfQUREUkVTU19ISUdICQkJCQkgICAgMHg2MWMKKyNkZWZpbmUgUENJX0RBQ19DU18yX0JBU0VfQUREUkVTU19MT1cJCQkJMHg2MjAKKyNkZWZpbmUgUENJX0RBQ19DU18yX0JBU0VfQUREUkVTU19ISUdICQkJCTB4NjI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIENvbmZpZ3VyYXRpb24gRnVuY3Rpb24gNwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBDSV9EQUNfQ1NfM19CQVNFX0FERFJFU1NfTE9XCQkJCQkJMHg3MTAKKyNkZWZpbmUgUENJX0RBQ19DU18zX0JBU0VfQUREUkVTU19ISUdICQkJCQkgICAgMHg3MTQKKyNkZWZpbmUgUENJX0RBQ19CT09UQ1NfQkFTRV9BRERSRVNTX0xPVwkJCQkJICAgIDB4NzE4CisjZGVmaW5lIFBDSV9EQUNfQk9PVENTX0JBU0VfQUREUkVTU19ISUdICQkJCSAgICAweDcxYworI2RlZmluZSBQQ0lfREFDX0NQVV9CQVNFX0FERFJFU1NfTE9XCQkJCTB4NzIwCisjZGVmaW5lIFBDSV9EQUNfQ1BVX0JBU0VfQUREUkVTU19ISUdICQkJCTB4NzI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVY2NDM2MCBhbmQgTVY2NDQ2MCBQQ0kgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBQQ0kgQ29udHJvbCBSZWdpc3RlciBNYXAJICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfMF9ETExfU1RBVFVTX0FORF9DT01NQU5ECQkJCTB4MWQyMAorI2RlZmluZSBQQ0lfMV9ETExfU1RBVFVTX0FORF9DT01NQU5ECQkJCTB4MWRhMAorI2RlZmluZSBQQ0lfMF9NUFBfUEFEU19EUklWRV9DT05UUk9MCQkJCTB4MWQxQworI2RlZmluZSBQQ0lfMV9NUFBfUEFEU19EUklWRV9DT05UUk9MCQkJCTB4MWQ5QworI2RlZmluZSBQQ0lfMF9DT01NQU5ECQkJCQkweGMwMAorI2RlZmluZSBQQ0lfMV9DT01NQU5ECQkJCQkweGM4MAorI2RlZmluZSBQQ0lfMF9NT0RFCQkJCQkJCTB4ZDAwCisjZGVmaW5lIFBDSV8xX01PREUJCQkJCQkJMHhkODAKKyNkZWZpbmUgUENJXzBfUkVUUlkJCQkJCQkweGMwNAorI2RlZmluZSBQQ0lfMV9SRVRSWQkJCQkJCTB4Yzg0CisjZGVmaW5lIFBDSV8wX1JFQURfQlVGRkVSX0RJU0NBUkRfVElNRVIJCQkJMHhkMDQKKyNkZWZpbmUgUENJXzFfUkVBRF9CVUZGRVJfRElTQ0FSRF9USU1FUgkJCQkweGQ4NAorI2RlZmluZSBQQ0lfMF9NU0lfVFJJR0dFUl9USU1FUgkJCQkJCTB4YzM4CisjZGVmaW5lIFBDSV8xX01TSV9UUklHR0VSX1RJTUVSCQkJCQkJMHhjYjgKKyNkZWZpbmUgUENJXzBfQVJCSVRFUl9DT05UUk9MCQkJCQkJMHgxZDAwCisjZGVmaW5lIFBDSV8xX0FSQklURVJfQ09OVFJPTAkJCQkJCTB4MWQ4MAorI2RlZmluZSBQQ0lfMF9DUk9TU19CQVJfQ09OVFJPTF9MT1cJCQkJMHgxZDA4CisjZGVmaW5lIFBDSV8xX0NST1NTX0JBUl9DT05UUk9MX0xPVwkJCQkweDFkODgKKyNkZWZpbmUgUENJXzBfQ1JPU1NfQkFSX0NPTlRST0xfSElHSAkJCQkweDFkMGMKKyNkZWZpbmUgUENJXzFfQ1JPU1NfQkFSX0NPTlRST0xfSElHSAkJCQkweDFkOGMKKyNkZWZpbmUgUENJXzBfQ1JPU1NfQkFSX1RJTUVPVVQJCQkJCTB4MWQwNAorI2RlZmluZSBQQ0lfMV9DUk9TU19CQVJfVElNRU9VVAkJCQkJMHgxZDg0CisjZGVmaW5lIFBDSV8wX1NZTkNfQkFSUklFUl9UUklHR0VSX1JFRwkJCQkweDFEMTgKKyNkZWZpbmUgUENJXzFfU1lOQ19CQVJSSUVSX1RSSUdHRVJfUkVHCQkJCTB4MUQ5OAorI2RlZmluZSBQQ0lfMF9TWU5DX0JBUlJJRVJfVklSVFVBTF9SRUcJCQkJMHgxZDEwCisjZGVmaW5lIFBDSV8xX1NZTkNfQkFSUklFUl9WSVJUVUFMX1JFRwkJCQkweDFkOTAKKyNkZWZpbmUgUENJXzBfUDJQX0NPTkZJRwkJCQkJCTB4MWQxNAorI2RlZmluZSBQQ0lfMV9QMlBfQ09ORklHCQkJCQkJMHgxZDk0CisKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8wX0xPVwkJCQkweDFlMDAKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8wX0hJR0gJCQkweDFlMDQKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV8wCQkJCTB4MWUwOAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzFfTE9XCQkJCTB4MWUxMAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzFfSElHSAkJCTB4MWUxNAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzEJCQkJMHgxZTE4CisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMl9MT1cJCQkJMHgxZTIwCisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfMl9ISUdICQkJMHgxZTI0CisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfMgkJCQkweDFlMjgKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8zX0xPVwkJCQkweDFlMzAKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfQkFTRV8zX0hJR0gJCQkweDFlMzQKKyNkZWZpbmUgUENJXzBfQUNDRVNTX0NPTlRST0xfU0laRV8zCQkJCTB4MWUzOAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzRfTE9XCQkJCTB4MWU0MAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9CQVNFXzRfSElHSAkJCTB4MWU0NAorI2RlZmluZSBQQ0lfMF9BQ0NFU1NfQ09OVFJPTF9TSVpFXzQJCQkJMHgxZTQ4CisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfNV9MT1cJCQkJMHgxZTUwCisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX0JBU0VfNV9ISUdICQkJMHgxZTU0CisjZGVmaW5lIFBDSV8wX0FDQ0VTU19DT05UUk9MX1NJWkVfNQkJCQkweDFlNTgKKworI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzBfTE9XCQkJCTB4MWU4MAorI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzBfSElHSAkJCTB4MWU4NAorI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzAJCQkJMHgxZTg4CisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMV9MT1cJCQkJMHgxZTkwCisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfMV9ISUdICQkJMHgxZTk0CisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfMQkJCQkweDFlOTgKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8yX0xPVwkJCQkweDFlYTAKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV8yX0hJR0gJCQkweDFlYTQKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV8yCQkJCTB4MWVhOAorI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzNfTE9XCQkJCTB4MWViMAorI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9CQVNFXzNfSElHSAkJCTB4MWViNAorI2RlZmluZSBQQ0lfMV9BQ0NFU1NfQ09OVFJPTF9TSVpFXzMJCQkJMHgxZWI4CisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfNF9MT1cJCQkJMHgxZWMwCisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX0JBU0VfNF9ISUdICQkJMHgxZWM0CisjZGVmaW5lIFBDSV8xX0FDQ0VTU19DT05UUk9MX1NJWkVfNAkJCQkweDFlYzgKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV81X0xPVwkJCQkweDFlZDAKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfQkFTRV81X0hJR0gJCQkweDFlZDQKKyNkZWZpbmUgUENJXzFfQUNDRVNTX0NPTlRST0xfU0laRV81CQkJCTB4MWVkOAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIENvbmZpZ3VyYXRpb24gQWNjZXNzIFJlZ2lzdGVycyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJXzBfQ09ORklHX0FERFIJCQkJMHhjZjgKKyNkZWZpbmUgUENJXzBfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcJCQkJMHhjZmMKKyNkZWZpbmUgUENJXzFfQ09ORklHX0FERFIJCQkJMHhjNzgKKyNkZWZpbmUgUENJXzFfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcJCQkJMHhjN2MKKyNkZWZpbmUgUENJXzBfSU5URVJSVVBUX0FDS05PV0xFREdFX1ZJUlRVQUxfUkVHIDB4YzM0CisjZGVmaW5lIFBDSV8xX0lOVEVSUlVQVF9BQ0tOT1dMRURHRV9WSVJUVUFMX1JFRyAweGNiNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIEVycm9yIFJlcG9ydCBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfMF9TRVJSX01BU0sJCQkJCTB4YzI4CisjZGVmaW5lIFBDSV8xX1NFUlJfTUFTSwkJCQkJMHhjYTgKKyNkZWZpbmUgUENJXzBfRVJST1JfQUREUl9MT1cJCQkJCQkweDFkNDAKKyNkZWZpbmUgUENJXzFfRVJST1JfQUREUl9MT1cJCQkJCQkweDFkYzAKKyNkZWZpbmUgUENJXzBfRVJST1JfQUREUl9ISUdICQkJCQkJMHgxZDQ0CisjZGVmaW5lIFBDSV8xX0VSUk9SX0FERFJfSElHSAkJCQkJCTB4MWRjNAorI2RlZmluZSBQQ0lfMF9FUlJPUl9BVFRSSUJVVEUJCQkJCQkweDFkNDgKKyNkZWZpbmUgUENJXzFfRVJST1JfQVRUUklCVVRFCQkJCQkJMHgxZGM4CisjZGVmaW5lIFBDSV8wX0VSUk9SX0NPTU1BTkQJCQkJCQkweDFkNTAKKyNkZWZpbmUgUENJXzFfRVJST1JfQ09NTUFORAkJCQkJCTB4MWRkMAorI2RlZmluZSBQQ0lfMF9FUlJPUl9DQVVTRQkJCQkJCTB4MWQ1OAorI2RlZmluZSBQQ0lfMV9FUlJPUl9DQVVTRQkJCQkJCTB4MWRkOAorI2RlZmluZSBQQ0lfMF9FUlJPUl9NQVNLCQkJCQkJMHgxZDVjCisjZGVmaW5lIFBDSV8xX0VSUk9SX01BU0sJCQkJCQkweDFkZGMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIFBDSSBEZWJ1ZyBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfMF9NTUFTSwkJCQkJCQkwWDFEMjQKKyNkZWZpbmUgUENJXzFfTU1BU0sJCQkJCQkJMFgxREE0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ0kgQ29uZmlndXJhdGlvbiwgRnVuY3Rpb24gMCwgUmVnaXN0ZXJzICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfREVWSUNFX0FORF9WRU5ET1JfSUQJCQkweDAwMAorI2RlZmluZSBQQ0lfU1RBVFVTX0FORF9DT01NQU5ECQkJMHgwMDQKKyNkZWZpbmUgUENJX0NMQVNTX0NPREVfQU5EX1JFVklTSU9OX0lECQkJMHgwMDgKKyNkZWZpbmUgUENJX0JJU1RfSEVBREVSX1RZUEVfTEFURU5DWV9USU1FUl9DQUNIRV9MSU5FCQkweDAwQworCisjZGVmaW5lIFBDSV9TQ1NfMF9CQVNFX0FERFJfTE9XCQkJCTB4MDEwCisjZGVmaW5lIFBDSV9TQ1NfMF9CQVNFX0FERFJfSElHSAkJCTB4MDE0CisjZGVmaW5lIFBDSV9TQ1NfMV9CQVNFX0FERFJfTE9XCQkJCTB4MDE4CisjZGVmaW5lIFBDSV9TQ1NfMV9CQVNFX0FERFJfSElHSAkJCTB4MDFDCisjZGVmaW5lIFBDSV9JTlRFUk5BTF9SRUdfTUVNX01BUFBFRF9CQVNFX0FERFJfTE9XICAgIDB4MDIwCisjZGVmaW5lIFBDSV9JTlRFUk5BTF9SRUdfTUVNX01BUFBFRF9CQVNFX0FERFJfSElHSCAgIDB4MDI0CisgLyojZGVmaW5lIFBDSV9TVUJTWVNURU1fSURfQU5EX1NVQlNZU1RFTV9WRU5ET1JfSUQJMHgwMmMxICovCisjZGVmaW5lIFBDSV9FWFBBTlNJT05fUk9NX0JBU0VfQUREUl9SRUcJCTB4MDMwCisjZGVmaW5lIFBDSV9DQVBBQklMVFlfTElTVF9QT0lOVEVSCQkJCTB4MDM0CisjZGVmaW5lIFBDSV9JTlRFUlJVUFRfUElOX0FORF9MSU5FCQkJMHgwM0MKKyAgICAgICAvKiBjYXBhYmlsaXR5IGxpc3QgKi8KKyNkZWZpbmUgUENJX1BPV0VSX01BTkFHRU1FTlRfQ0FQQUJJTElUWQkJCQkweDA0MAorI2RlZmluZSBQQ0lfUE9XRVJfTUFOQUdFTUVOVF9TVEFUVVNfQU5EX0NPTlRST0wJICAgICAweDA0NAorI2RlZmluZSBQQ0lfVlBEX0FERFIJCQkJCQkJMHgwNDgKKyNkZWZpbmUgUENJX1ZQRF9EQVRBCQkJCQkJCTB4MDRjCisjZGVmaW5lIFBDSV9NU0lfTUVTU0FHRV9DT05UUk9MCQkJCQkweDA1MAorI2RlZmluZSBQQ0lfTVNJX01FU1NBR0VfQUREUgkJCQkJCTB4MDU0CisjZGVmaW5lIFBDSV9NU0lfTUVTU0FHRV9VUFBFUl9BRERSCQkJCTB4MDU4CisjZGVmaW5lIFBDSV9NU0lfTUVTU0FHRV9EQVRBCQkJCQkJMHgwNWMKKyNkZWZpbmUgUENJX1hfQ09NTUFORAkJCQkJCQkweDA2MAorI2RlZmluZSBQQ0lfWF9TVEFUVVMJCQkJCQkJMHgwNjQKKyNkZWZpbmUgUENJX0NPTVBBQ1RfUENJX0hPVF9TV0FQCQkJCTB4MDY4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDEsIFJlZ2lzdGVycyAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfU0NTXzJfQkFTRV9BRERSX0xPVwkJCQkweDExMAorI2RlZmluZSBQQ0lfU0NTXzJfQkFTRV9BRERSX0hJR0gJCQkweDExNAorI2RlZmluZSBQQ0lfU0NTXzNfQkFTRV9BRERSX0xPVwkJCQkweDExOAorI2RlZmluZSBQQ0lfU0NTXzNfQkFTRV9BRERSX0hJR0gJCQkweDExYworI2RlZmluZSBQQ0lfSU5URVJOQUxfU1JBTV9CQVNFX0FERFJfTE9XCQkJCQkweDEyMAorI2RlZmluZSBQQ0lfSU5URVJOQUxfU1JBTV9CQVNFX0FERFJfSElHSAkJCQkweDEyNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDIsIFJlZ2lzdGVycyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX0RFVkNTXzBfQkFTRV9BRERSX0xPVwkJCTB4MjEwCisjZGVmaW5lIFBDSV9ERVZDU18wX0JBU0VfQUREUl9ISUdICQkJMHgyMTQKKyNkZWZpbmUgUENJX0RFVkNTXzFfQkFTRV9BRERSX0xPVwkJCTB4MjE4CisjZGVmaW5lIFBDSV9ERVZDU18xX0JBU0VfQUREUl9ISUdICQkJCTB4MjFjCisjZGVmaW5lIFBDSV9ERVZDU18yX0JBU0VfQUREUl9MT1cJCQkweDIyMAorI2RlZmluZSBQQ0lfREVWQ1NfMl9CQVNFX0FERFJfSElHSAkJCQkweDIyNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgUENJIENvbmZpZ3VyYXRpb24sIEZ1bmN0aW9uIDMsIFJlZ2lzdGVycyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX0RFVkNTXzNfQkFTRV9BRERSX0xPVwkJCTB4MzEwCisjZGVmaW5lIFBDSV9ERVZDU18zX0JBU0VfQUREUl9ISUdICQkJMHgzMTQKKyNkZWZpbmUgUENJX0JPT1RfQ1NfQkFTRV9BRERSX0xPVwkJCTB4MzE4CisjZGVmaW5lIFBDSV9CT09UX0NTX0JBU0VfQUREUl9ISUdICQkJCTB4MzFjCisjZGVmaW5lIFBDSV9DUFVfQkFTRV9BRERSX0xPVwkJCQkweDIyMAorI2RlZmluZSBQQ0lfQ1BVX0JBU0VfQUREUl9ISUdICQkJCTB4MjI0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBQQ0kgQ29uZmlndXJhdGlvbiwgRnVuY3Rpb24gNCwgUmVnaXN0ZXJzICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfUDJQX01FTTBfQkFTRV9BRERSX0xPVwkJCTB4NDEwCisjZGVmaW5lIFBDSV9QMlBfTUVNMF9CQVNFX0FERFJfSElHSAkJCTB4NDE0CisjZGVmaW5lIFBDSV9QMlBfTUVNMV9CQVNFX0FERFJfTE9XCQkJMHg0MTgKKyNkZWZpbmUgUENJX1AyUF9NRU0xX0JBU0VfQUREUl9ISUdICQkJMHg0MWMKKyNkZWZpbmUgUENJX1AyUF9JX09fQkFTRV9BRERSCQkJCQkJMHg0MjAKKyNkZWZpbmUgUENJX0lOVEVSTkFMX1JFR1NfSV9PX01BUFBFRF9CQVNFX0FERFIJCSAgMHg0MjQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNVjY0MzYwIGFuZCBNVjY0NDYwIFBDSSBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJMjAgU3VwcG9ydCByZWdpc3RlcnMJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOQk9VTkRfTUVTU0FHRV9SRUdJU1RFUjBfUENJX1NJREUJCTB4MDEwCisjZGVmaW5lIElOQk9VTkRfTUVTU0FHRV9SRUdJU1RFUjFfUENJX1NJREUJCTB4MDE0CisjZGVmaW5lIE9VVEJPVU5EX01FU1NBR0VfUkVHSVNURVIwX1BDSV9TSURFCQkweDAxOAorI2RlZmluZSBPVVRCT1VORF9NRVNTQUdFX1JFR0lTVEVSMV9QQ0lfU0lERQkJMHgwMUMKKyNkZWZpbmUgSU5CT1VORF9ET09SQkVMTF9SRUdJU1RFUl9QQ0lfU0lERQkJMHgwMjAKKyNkZWZpbmUgSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHSVNURVJfUENJX1NJREUJMHgwMjQKKyNkZWZpbmUgSU5CT1VORF9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUl9QQ0lfU0lERQkweDAyOAorI2RlZmluZSBPVVRCT1VORF9ET09SQkVMTF9SRUdJU1RFUl9QQ0lfU0lERQkJMHgwMkMKKyNkZWZpbmUgT1VUQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSX1BDSV9TSURFCTB4MDMwCisjZGVmaW5lIE9VVEJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX1BDSV9TSURFCTB4MDM0CisjZGVmaW5lIElOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR0lTVEVSX1BDSV9TSURFCTB4MDQwCisjZGVmaW5lIE9VVEJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdJU1RFUl9QQ0lfU0lERQkweDA0NAorI2RlZmluZSBRVUVVRV9DT05UUk9MX1JFR0lTVEVSX1BDSV9TSURFCQkJMHgwNTAKKyNkZWZpbmUgUVVFVUVfQkFTRV9BRERSRVNTX1JFR0lTVEVSX1BDSV9TSURFCQkweDA1NAorI2RlZmluZSBJTkJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDYwCisjZGVmaW5lIElOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHSVNURVJfUENJX1NJREUJMHgwNjQKKyNkZWZpbmUgSU5CT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdJU1RFUl9QQ0lfU0lERQkweDA2OAorI2RlZmluZSBJTkJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDZDCisjZGVmaW5lIE9VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDcwCisjZGVmaW5lIE9VVEJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDc0CisjZGVmaW5lIE9VVEJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDc4CisjZGVmaW5lIE9VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR0lTVEVSX1BDSV9TSURFCTB4MDdDCisKKyNkZWZpbmUgSU5CT1VORF9NRVNTQUdFX1JFR0lTVEVSMF9DUFVfU0lERQkJMHgxQzEwCisjZGVmaW5lIElOQk9VTkRfTUVTU0FHRV9SRUdJU1RFUjFfQ1BVX1NJREUJCTB4MUMxNAorI2RlZmluZSBPVVRCT1VORF9NRVNTQUdFX1JFR0lTVEVSMF9DUFVfU0lERQkJMHgxQzE4CisjZGVmaW5lIE9VVEJPVU5EX01FU1NBR0VfUkVHSVNURVIxX0NQVV9TSURFCQkweDFDMUMKKyNkZWZpbmUgSU5CT1VORF9ET09SQkVMTF9SRUdJU1RFUl9DUFVfU0lERQkJMHgxQzIwCisjZGVmaW5lIElOQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSX0NQVV9TSURFCTB4MUMyNAorI2RlZmluZSBJTkJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0NQVV9TSURFCTB4MUMyOAorI2RlZmluZSBPVVRCT1VORF9ET09SQkVMTF9SRUdJU1RFUl9DUFVfU0lERQkJMHgxQzJDCisjZGVmaW5lIE9VVEJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUl9DUFVfU0lERQkweDFDMzAKKyNkZWZpbmUgT1VUQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHSVNURVJfQ1BVX1NJREUJMHgxQzM0CisjZGVmaW5lIElOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR0lTVEVSX0NQVV9TSURFCQkweDFDNDAKKyNkZWZpbmUgT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR0lTVEVSX0NQVV9TSURFCQkweDFDNDQKKyNkZWZpbmUgUVVFVUVfQ09OVFJPTF9SRUdJU1RFUl9DUFVfU0lERQkJCQkweDFDNTAKKyNkZWZpbmUgUVVFVUVfQkFTRV9BRERSRVNTX1JFR0lTVEVSX0NQVV9TSURFCQkJMHgxQzU0CisjZGVmaW5lIElOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHSVNURVJfQ1BVX1NJREUJCTB4MUM2MAorI2RlZmluZSBJTkJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR0lTVEVSX0NQVV9TSURFCQkweDFDNjQKKyNkZWZpbmUgSU5CT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdJU1RFUl9DUFVfU0lERQkJMHgxQzY4CisjZGVmaW5lIElOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHSVNURVJfQ1BVX1NJREUJCTB4MUM2QworI2RlZmluZSBPVVRCT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdJU1RFUl9DUFVfU0lERQkJMHgxQzcwCisjZGVmaW5lIE9VVEJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR0lTVEVSX0NQVV9TSURFCQkweDFDNzQKKyNkZWZpbmUgT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHSVNURVJfQ1BVX1NJREUJCTB4MUM3OAorI2RlZmluZSBPVVRCT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdJU1RFUl9DUFVfU0lERQkJMHgxQzdDCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNZXNzYWdpbmcgVW5pdCBSZWdpc3RlcnMgKEkyMCkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEkyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMF9TSURFCQkJMHgwMTAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcxX1BDSV8wX1NJREUJCQkJMHgwMTQKKyNkZWZpbmUgSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMF9TSURFCQkJCTB4MDE4CisjZGVmaW5lIEkyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfUENJXzBfU0lERQkJCQkweDAxQworI2RlZmluZSBJMk9fSU5CT1VORF9ET09SQkVMTF9SRUdfUENJXzBfU0lERQkJCQkweDAyMAorI2RlZmluZSBJMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8wX1NJREUJCTB4MDI0CisjZGVmaW5lIEkyT19JTkJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19QQ0lfMF9TSURFCQkJMHgwMjgKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMF9TSURFCQkJCTB4MDJDCisjZGVmaW5lIEkyT19PVVRCT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8wX1NJREUJCTB4MDMwCisjZGVmaW5lIEkyT19PVVRCT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfUENJXzBfU0lERQkJMHgwMzQKKyNkZWZpbmUgSTJPX0lOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMF9TSURFCQkweDA0MAorI2RlZmluZSBJMk9fT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMF9TSURFCQkweDA0NAorI2RlZmluZSBJMk9fUVVFVUVfQ09OVFJPTF9SRUdfUENJXzBfU0lERQkJCTB4MDUwCisjZGVmaW5lIEkyT19RVUVVRV9CQVNFX0FERFJfUkVHX1BDSV8wX1NJREUJCQkweDA1NAorI2RlZmluZSBJMk9fSU5CT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkJMHgwNjAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJCTB4MDY0CisjZGVmaW5lIEkyT19JTkJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCQkweDA2OAorI2RlZmluZSBJMk9fSU5CT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkJMHgwNkMKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCQkweDA3MAorI2RlZmluZSBJMk9fT1VUQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8wX1NJREUJCTB4MDc0CisjZGVmaW5lIEkyT19PVVRCT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfUENJXzBfU0lERQkJMHgwRjgKKyNkZWZpbmUgSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMF9TSURFCQkweDBGQworCisjZGVmaW5lIEkyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMV9TSURFCQkJMHgwOTAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcxX1BDSV8xX1NJREUJCQkJMHgwOTQKKyNkZWZpbmUgSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9QQ0lfMV9TSURFCQkJCTB4MDk4CisjZGVmaW5lIEkyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfUENJXzFfU0lERQkJCQkweDA5QworI2RlZmluZSBJMk9fSU5CT1VORF9ET09SQkVMTF9SRUdfUENJXzFfU0lERQkJCQkweDBBMAorI2RlZmluZSBJMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8xX1NJREUJCTB4MEE0CisjZGVmaW5lIEkyT19JTkJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19QQ0lfMV9TSURFCQkJMHgwQTgKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0RPT1JCRUxMX1JFR19QQ0lfMV9TSURFCQkJCTB4MEFDCisjZGVmaW5lIEkyT19PVVRCT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX1BDSV8xX1NJREUJCTB4MEIwCisjZGVmaW5lIEkyT19PVVRCT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfUENJXzFfU0lERQkJMHgwQjQKKyNkZWZpbmUgSTJPX0lOQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMV9TSURFCQkweDBDMAorI2RlZmluZSBJMk9fT1VUQk9VTkRfUVVFVUVfUE9SVF9WSVJUVUFMX1JFR19QQ0lfMV9TSURFCQkweDBDNAorI2RlZmluZSBJMk9fUVVFVUVfQ09OVFJPTF9SRUdfUENJXzFfU0lERQkJCTB4MEQwCisjZGVmaW5lIEkyT19RVUVVRV9CQVNFX0FERFJfUkVHX1BDSV8xX1NJREUJCQkweDBENAorI2RlZmluZSBJMk9fSU5CT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkJMHgwRTAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJCTB4MEU0CisjZGVmaW5lIEkyT19JTkJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCQkweDBFOAorI2RlZmluZSBJMk9fSU5CT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkJMHgwRUMKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCQkweDBGMAorI2RlZmluZSBJMk9fT1VUQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX1BDSV8xX1NJREUJCTB4MEY0CisjZGVmaW5lIEkyT19PVVRCT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfUENJXzFfU0lERQkJMHgwNzgKKyNkZWZpbmUgSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19QQ0lfMV9TSURFCQkweDA3QworCisjZGVmaW5lIEkyT19JTkJPVU5EX01FU1NBR0VfUkVHMF9DUFUwX1NJREUJCQkweDFDMTAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfTUVTU0FHRV9SRUcxX0NQVTBfU0lERQkJCQkweDFDMTQKKyNkZWZpbmUgSTJPX09VVEJPVU5EX01FU1NBR0VfUkVHMF9DUFUwX1NJREUJCQkJMHgxQzE4CisjZGVmaW5lIEkyT19PVVRCT1VORF9NRVNTQUdFX1JFRzFfQ1BVMF9TSURFCQkJCTB4MUMxQworI2RlZmluZSBJMk9fSU5CT1VORF9ET09SQkVMTF9SRUdfQ1BVMF9TSURFCQkJCTB4MUMyMAorI2RlZmluZSBJMk9fSU5CT1VORF9JTlRFUlJVUFRfQ0FVU0VfUkVHX0NQVTBfU0lERQkJCTB4MUMyNAorI2RlZmluZSBJMk9fSU5CT1VORF9JTlRFUlJVUFRfTUFTS19SRUdfQ1BVMF9TSURFCQkJMHgxQzI4CisjZGVmaW5lIEkyT19PVVRCT1VORF9ET09SQkVMTF9SRUdfQ1BVMF9TSURFCQkJCTB4MUMyQworI2RlZmluZSBJMk9fT1VUQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19DUFUwX1NJREUJCTB4MUMzMAorI2RlZmluZSBJMk9fT1VUQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX0NQVTBfU0lERQkJMHgxQzM0CisjZGVmaW5lIEkyT19JTkJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfQ1BVMF9TSURFCQkweDFDNDAKKyNkZWZpbmUgSTJPX09VVEJPVU5EX1FVRVVFX1BPUlRfVklSVFVBTF9SRUdfQ1BVMF9TSURFCQkweDFDNDQKKyNkZWZpbmUgSTJPX1FVRVVFX0NPTlRST0xfUkVHX0NQVTBfU0lERQkJCQkweDFDNTAKKyNkZWZpbmUgSTJPX1FVRVVFX0JBU0VfQUREUl9SRUdfQ1BVMF9TSURFCQkJCTB4MUM1NAorI2RlZmluZSBJMk9fSU5CT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCQkweDFDNjAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX0NQVTBfU0lERQkJMHgxQzY0CisjZGVmaW5lIEkyT19JTkJPVU5EX1BPU1RfSEVBRF9QT0lOVEVSX1JFR19DUFUwX1NJREUJCTB4MUM2OAorI2RlZmluZSBJMk9fSU5CT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCQkweDFDNkMKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0ZSRUVfSEVBRF9QT0lOVEVSX1JFR19DUFUwX1NJREUJCTB4MUM3MAorI2RlZmluZSBJMk9fT1VUQk9VTkRfRlJFRV9UQUlMX1BPSU5URVJfUkVHX0NQVTBfU0lERQkJMHgxQzc0CisjZGVmaW5lIEkyT19PVVRCT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfQ1BVMF9TSURFCQkweDFDRjgKKyNkZWZpbmUgSTJPX09VVEJPVU5EX1BPU1RfVEFJTF9QT0lOVEVSX1JFR19DUFUwX1NJREUJCTB4MUNGQworI2RlZmluZSBJMk9fSU5CT1VORF9NRVNTQUdFX1JFRzBfQ1BVMV9TSURFCQkJMHgxQzkwCisjZGVmaW5lIEkyT19JTkJPVU5EX01FU1NBR0VfUkVHMV9DUFUxX1NJREUJCQkJMHgxQzk0CisjZGVmaW5lIEkyT19PVVRCT1VORF9NRVNTQUdFX1JFRzBfQ1BVMV9TSURFCQkJCTB4MUM5OAorI2RlZmluZSBJMk9fT1VUQk9VTkRfTUVTU0FHRV9SRUcxX0NQVTFfU0lERQkJCQkweDFDOUMKKyNkZWZpbmUgSTJPX0lOQk9VTkRfRE9PUkJFTExfUkVHX0NQVTFfU0lERQkJCQkweDFDQTAKKyNkZWZpbmUgSTJPX0lOQk9VTkRfSU5URVJSVVBUX0NBVVNFX1JFR19DUFUxX1NJREUJCQkweDFDQTQKKyNkZWZpbmUgSTJPX0lOQk9VTkRfSU5URVJSVVBUX01BU0tfUkVHX0NQVTFfU0lERQkJCTB4MUNBOAorI2RlZmluZSBJMk9fT1VUQk9VTkRfRE9PUkJFTExfUkVHX0NQVTFfU0lERQkJCQkweDFDQUMKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9DQVVTRV9SRUdfQ1BVMV9TSURFCQkweDFDQjAKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0lOVEVSUlVQVF9NQVNLX1JFR19DUFUxX1NJREUJCTB4MUNCNAorI2RlZmluZSBJMk9fSU5CT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX0NQVTFfU0lERQkJMHgxQ0MwCisjZGVmaW5lIEkyT19PVVRCT1VORF9RVUVVRV9QT1JUX1ZJUlRVQUxfUkVHX0NQVTFfU0lERQkJMHgxQ0M0CisjZGVmaW5lIEkyT19RVUVVRV9DT05UUk9MX1JFR19DUFUxX1NJREUJCQkJMHgxQ0QwCisjZGVmaW5lIEkyT19RVUVVRV9CQVNFX0FERFJfUkVHX0NQVTFfU0lERQkJCQkweDFDRDQKKyNkZWZpbmUgSTJPX0lOQk9VTkRfRlJFRV9IRUFEX1BPSU5URVJfUkVHX0NQVTFfU0lERQkJMHgxQ0UwCisjZGVmaW5lIEkyT19JTkJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19DUFUxX1NJREUJCTB4MUNFNAorI2RlZmluZSBJMk9fSU5CT1VORF9QT1NUX0hFQURfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCQkweDFDRTgKKyNkZWZpbmUgSTJPX0lOQk9VTkRfUE9TVF9UQUlMX1BPSU5URVJfUkVHX0NQVTFfU0lERQkJMHgxQ0VDCisjZGVmaW5lIEkyT19PVVRCT1VORF9GUkVFX0hFQURfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCQkweDFDRjAKKyNkZWZpbmUgSTJPX09VVEJPVU5EX0ZSRUVfVEFJTF9QT0lOVEVSX1JFR19DUFUxX1NJREUJCTB4MUNGNAorI2RlZmluZSBJMk9fT1VUQk9VTkRfUE9TVF9IRUFEX1BPSU5URVJfUkVHX0NQVTFfU0lERQkJMHgxQzc4CisjZGVmaW5lIEkyT19PVVRCT1VORF9QT1NUX1RBSUxfUE9JTlRFUl9SRUdfQ1BVMV9TSURFCQkweDFDN0MKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENvbW11bmljYXRpb24gVW5pdCBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisjZGVmaW5lIEVUSEVSTkVUXzBfQUREUkVTU19DT05UUk9MX0xPVwkJCQkJCTB4ZjIwMAorI2RlZmluZSBFVEhFUk5FVF8wX0FERFJFU1NfQ09OVFJPTF9ISUdICQkJICAgIDB4ZjIwNAorI2RlZmluZSBFVEhFUk5FVF8wX1JFQ0VJVkVfQlVGRkVSX1BDSV9ISUdIX0FERFJFU1MJICAgIDB4ZjIwOAorI2RlZmluZSBFVEhFUk5FVF8wX1RSQU5TTUlUX0JVRkZFUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyMGMKKyNkZWZpbmUgRVRIRVJORVRfMF9SRUNFSVZFX0RFU0NSSVBUT1JfUENJX0hJR0hfQUREUkVTUwkgICAgMHhmMjEwCisjZGVmaW5lIEVUSEVSTkVUXzBfVFJBTlNNSVRfREVTQ1JJUFRPUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyMTQKKyNkZWZpbmUgRVRIRVJORVRfMF9IQVNIX1RBQkxFX1BDSV9ISUdIX0FERFJFU1MJCSAgICAweGYyMTgKKyNkZWZpbmUgRVRIRVJORVRfMV9BRERSRVNTX0NPTlRST0xfTE9XCQkJICAgIDB4ZjIyMAorI2RlZmluZSBFVEhFUk5FVF8xX0FERFJFU1NfQ09OVFJPTF9ISUdICQkJICAgIDB4ZjIyNAorI2RlZmluZSBFVEhFUk5FVF8xX1JFQ0VJVkVfQlVGRkVSX1BDSV9ISUdIX0FERFJFU1MJICAgIDB4ZjIyOAorI2RlZmluZSBFVEhFUk5FVF8xX1RSQU5TTUlUX0JVRkZFUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyMmMKKyNkZWZpbmUgRVRIRVJORVRfMV9SRUNFSVZFX0RFU0NSSVBUT1JfUENJX0hJR0hfQUREUkVTUwkgICAgMHhmMjMwCisjZGVmaW5lIEVUSEVSTkVUXzFfVFJBTlNNSVRfREVTQ1JJUFRPUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyMzQKKyNkZWZpbmUgRVRIRVJORVRfMV9IQVNIX1RBQkxFX1BDSV9ISUdIX0FERFJFU1MJCSAgICAweGYyMzgKKyNkZWZpbmUgRVRIRVJORVRfMl9BRERSRVNTX0NPTlRST0xfTE9XCQkJICAgIDB4ZjI0MAorI2RlZmluZSBFVEhFUk5FVF8yX0FERFJFU1NfQ09OVFJPTF9ISUdICQkJICAgIDB4ZjI0NAorI2RlZmluZSBFVEhFUk5FVF8yX1JFQ0VJVkVfQlVGRkVSX1BDSV9ISUdIX0FERFJFU1MJICAgIDB4ZjI0OAorI2RlZmluZSBFVEhFUk5FVF8yX1RSQU5TTUlUX0JVRkZFUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyNGMKKyNkZWZpbmUgRVRIRVJORVRfMl9SRUNFSVZFX0RFU0NSSVBUT1JfUENJX0hJR0hfQUREUkVTUwkgICAgMHhmMjUwCisjZGVmaW5lIEVUSEVSTkVUXzJfVFJBTlNNSVRfREVTQ1JJUFRPUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyNTQKKyNkZWZpbmUgRVRIRVJORVRfMl9IQVNIX1RBQkxFX1BDSV9ISUdIX0FERFJFU1MJCSAgICAweGYyNTgKKyAqLworI2RlZmluZSBNUFNDXzBfQUREUkVTU19DT05UUk9MX0xPVwkJCSAgICAweGYyODAKKyNkZWZpbmUgTVBTQ18wX0FERFJFU1NfQ09OVFJPTF9ISUdICQkJICAgIDB4ZjI4NAorI2RlZmluZSBNUFNDXzBfUkVDRUlWRV9CVUZGRVJfUENJX0hJR0hfQUREUkVTUwkJICAgIDB4ZjI4OAorI2RlZmluZSBNUFNDXzBfVFJBTlNNSVRfQlVGRkVSX1BDSV9ISUdIX0FERFJFU1MJCSAgICAweGYyOGMKKyNkZWZpbmUgTVBTQ18wX1JFQ0VJVkVfREVTQ1JJUFRPUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyOTAKKyNkZWZpbmUgTVBTQ18wX1RSQU5TTUlUX0RFU0NSSVBUT1JfUENJX0hJR0hfQUREUkVTUwkgICAgMHhmMjk0CisjZGVmaW5lIE1QU0NfMV9BRERSRVNTX0NPTlRST0xfTE9XCQkJICAgIDB4ZjJjMAorI2RlZmluZSBNUFNDXzFfQUREUkVTU19DT05UUk9MX0hJR0gJCQkgICAgMHhmMmM0CisjZGVmaW5lIE1QU0NfMV9SRUNFSVZFX0JVRkZFUl9QQ0lfSElHSF9BRERSRVNTCQkgICAgMHhmMmM4CisjZGVmaW5lIE1QU0NfMV9UUkFOU01JVF9CVUZGRVJfUENJX0hJR0hfQUREUkVTUwkJICAgIDB4ZjJjYworI2RlZmluZSBNUFNDXzFfUkVDRUlWRV9ERVNDUklQVE9SX1BDSV9ISUdIX0FERFJFU1MJICAgIDB4ZjJkMAorI2RlZmluZSBNUFNDXzFfVFJBTlNNSVRfREVTQ1JJUFRPUl9QQ0lfSElHSF9BRERSRVNTCSAgICAweGYyZDQKKyAvKiNkZWZpbmUgU0VSSUFMX0lOSVRfUENJX0hJR0hfQUREUkVTUwkJCSAgICAgICAweGYzMjAxICovCisjZGVmaW5lIENPTU1fVU5JVF9BUkJJVEVSX0NPTlRST0wJCQkgICAgMHhmMzAwCisjZGVmaW5lIENPTU1fVU5JVF9DUk9TU19CQVJfVElNRU9VVAkJCSAgICAweGYzMDQKKyNkZWZpbmUgQ09NTV9VTklUX0lOVEVSUlVQVF9DQVVTRQkJCSAgICAweGYzMTAKKyNkZWZpbmUgQ09NTV9VTklUX0lOVEVSUlVQVF9NQVNLCQkJICAgIDB4ZjMxNAorI2RlZmluZSBDT01NX1VOSVRfRVJST1JfQUREUkVTUwkJCQkgICAgMHhmMzE0CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgIFNlcmlhbCBJbml0aWFsaXphdGlvbiByZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyojZGVmaW5lIFNFUklBTF9JTklUX0xBU1RfREFUQQkJCQkJMHhmMzI0MSAqLworIC8qI2RlZmluZSBTRVJJQUxfSU5JVF9TVEFUVVNfQU5EX0NPTlRST0wJCQkweGYzMjgxICovCisjZGVmaW5lIFNFUklBTF9JTklUX0xBU1RfREFUQQkJCQkJCTB4ZjMyNAorI2RlZmluZSBTRVJJQUxfSU5JVF9DT05UUk9MCQkJCQkJMHhmMzI4CisjZGVmaW5lIFNFUklBTF9JTklUX1NUQVRVUwkJCQkJCTB4ZjMyYworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICBFdGhlcm5ldCBVbml0IFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVUSF9QSFlfQUREUl9SRUcJCQkweDIwMDAKKyNkZWZpbmUgRVRIX1NNSV9SRUcJCQkJCTB4MjAwNAorI2RlZmluZSBFVEhfVU5JVF9ERUZBVUxUX0FERFJfUkVHCQkweDIwMDgKKyNkZWZpbmUgRVRIX1VOSVRfREVGQVVMVElEX1JFRwkJCTB4MjAwYworI2RlZmluZSBFVEhfVU5JVF9JTlRFUlJVUFRfQ0FVU0VfUkVHCTB4MjA4MAorI2RlZmluZSBFVEhfVU5JVF9JTlRFUlJVUFRfTUFTS19SRUcJMHgyMDg0CisjZGVmaW5lIEVUSF9VTklUX0lOVEVSTkFMX1VTRV9SRUcJCTB4MjRmYworI2RlZmluZSBFVEhfVU5JVF9FUlJPUl9BRERSX1JFRwkJCTB4MjA5NAorI2RlZmluZSBFVEhfQkFSXzAJCQkJCTB4MjIwMAorI2RlZmluZSBFVEhfQkFSXzEJCQkJCTB4MjIwOAorI2RlZmluZSBFVEhfQkFSXzIJCQkJCTB4MjIxMAorI2RlZmluZSBFVEhfQkFSXzMJCQkJCTB4MjIxOAorI2RlZmluZSBFVEhfQkFSXzQJCQkJCTB4MjIyMAorI2RlZmluZSBFVEhfQkFSXzUJCQkJCTB4MjIyOAorI2RlZmluZSBFVEhfU0laRV9SRUdfMAkJCQkweDIyMDQKKyNkZWZpbmUgRVRIX1NJWkVfUkVHXzEJCQkJMHgyMjBjCisjZGVmaW5lIEVUSF9TSVpFX1JFR18yCQkJCTB4MjIxNAorI2RlZmluZSBFVEhfU0laRV9SRUdfMwkJCQkweDIyMWMKKyNkZWZpbmUgRVRIX1NJWkVfUkVHXzQJCQkJMHgyMjI0CisjZGVmaW5lIEVUSF9TSVpFX1JFR181CQkJCQkweDIyMmMKKyNkZWZpbmUgRVRIX0hFQURFUlNfUkVUQVJHRVRfQkFTRV9SRUcJCQkweDIyMzAKKyNkZWZpbmUgRVRIX0hFQURFUlNfUkVUQVJHRVRfQ09OVFJPTF9SRUcJMHgyMjM0CisjZGVmaW5lIEVUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzAJCTB4MjI4MAorI2RlZmluZSBFVEhfSElHSF9BRERSX1JFTUFQX1JFR18xCQkweDIyODQKKyNkZWZpbmUgRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfMgkJMHgyMjg4CisjZGVmaW5lIEVUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzMJCQkweDIyOGMKKyNkZWZpbmUgRVRIX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJMHgyMjkwCisjZGVmaW5lIEVUSF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcocG9ydCkJCQkoMHgyMjk0ICsgKHBvcnQ8PDIpKQorI2RlZmluZSBFVEhfTUlCX0NPVU5URVJTX0JBU0UocG9ydCkJCQkoMHgzMDAwICsgKHBvcnQ8PDcpKQorI2RlZmluZSBFVEhfUE9SVF9DT05GSUdfUkVHKHBvcnQpCQkJCSgweDI0MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRyhwb3J0KQkJKDB4MjQwNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9NSUlfU0VSSUFMX1BBUkFNRVRSU19SRUcocG9ydCkJCSgweDI0MDggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfR01JSV9TRVJJQUxfUEFSQU1FVFJTX1JFRyhwb3J0KQkJKDB4MjQwYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9WTEFOX0VUSEVSVFlQRV9SRUcocG9ydCkJCQkoMHgyNDEwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX01BQ19BRERSX0xPVyhwb3J0KQkJCQkJKDB4MjQxNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9NQUNfQUREUl9ISUdIKHBvcnQpCQkJCQkoMHgyNDE4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1NETUFfQ09ORklHX1JFRyhwb3J0KQkJCQkoMHgyNDFjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RTQ1BfMChwb3J0KQkJCQkJKDB4MjQyMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9EU0NQXzEocG9ydCkJCQkJCSgweDI0MjQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfRFNDUF8yKHBvcnQpCQkJCQkoMHgyNDI4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RTQ1BfMyhwb3J0KQkJCQkJKDB4MjQyYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9EU0NQXzQocG9ydCkJCQkJCSgweDI0MzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfRFNDUF81KHBvcnQpCQkJCQkoMHgyNDM0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RTQ1BfNihwb3J0KQkJCQkJKDB4MjQzOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0KQkJKDB4MjQzYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9WTEFOX1BSSU9SSVRZX1RBR19UT19QUklPUklUWShwb3J0KQkJKDB4MjQ0MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX1NUQVRVU19SRUcocG9ydCkJCQkJKDB4MjQ0NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhwb3J0KQkoMHgyNDQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFX0ZJWEVEX1BSSU9SSVRZKHBvcnQpCQkoMHgyNDRjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1BPUlRfVFhfVE9LRU5fQlVDS0VUX1JBVEVfQ09ORklHKHBvcnQpCQkoMHgyNDUwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX01BWElNVU1fVFJBTlNNSVRfVU5JVChwb3J0KQkJCQkoMHgyNDU4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1BPUlRfTUFYSU1VTV9UT0tFTl9CVUNLRVRfU0laRShwb3J0KQkJKDB4MjQ1YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnQpCQkJCSgweDI0NjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfSU5URVJSVVBUX0NBVVNFX0VYVEVORF9SRUcocG9ydCkJCQkoMHgyNDY0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0KQkJCQkoMHgyNDY4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcocG9ydCkJCQkoMHgyNDZjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRF9SRUcocG9ydCkJCQkoMHgyNDcwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRF9SRUcocG9ydCkJCQkoMHgyNDc0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX01JTklNQUxfRlJBTUVfU0laRV9SRUcocG9ydCkJCQkoMHgyNDdjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0RJU0NBUkRFRF9GUkFNRVNfQ09VTlRFUihwb3J0KQkJCSgweDI0ODQgKyAocG9ydDw8MTApCisjZGVmaW5lIEVUSF9QT1JUX0RFQlVHXzBfUkVHKHBvcnQpCQkJCQkoMHgyNDhjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1BPUlRfREVCVUdfMV9SRUcocG9ydCkJCQkJCSgweDI0OTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUE9SVF9JTlRFUk5BTF9BRERSX0VSUk9SX1JFRyhwb3J0KQkJCSgweDI0OTQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfSU5URVJOQUxfVVNFX1JFRyhwb3J0KQkJCQkJKDB4MjRmYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnQpCQkJKDB4MjY4MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9DVVJSRU5UX1NFUlZFRF9UWF9ERVNDX1BUUihwb3J0KQkJCSgweDI2ODQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wKHBvcnQpCQkJKDB4MjYwYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzEocG9ydCkJCQkoMHgyNjFjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMihwb3J0KQkJCSgweDI2MmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8zKHBvcnQpCQkJKDB4MjYzYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzQocG9ydCkJCQkoMHgyNjRjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfNShwb3J0KQkJCSgweDI2NWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl82KHBvcnQpCQkJKDB4MjY2YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzcocG9ydCkJCQkoMHgyNjdjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMChwb3J0KQkJCSgweDI2YzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8xKHBvcnQpCQkJKDB4MjZjNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzIocG9ydCkJCQkoMHgyNmM4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMyhwb3J0KQkJCSgweDI2Y2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl80KHBvcnQpCQkJKDB4MjZkMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzUocG9ydCkJCQkoMHgyNmQ0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfNihwb3J0KQkJCSgweDI2ZDggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl83KHBvcnQpCQkJKDB4MjZkYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8wX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJCSgweDI3MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMV9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCQkoMHgyNzEwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzJfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkJKDB4MjcyMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8zX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJCSgweDI3MzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNF9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCQkoMHgyNzQwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzVfVE9LRU5fQlVDS0VUX0NPVU5UKHBvcnQpCQkJKDB4Mjc1MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV82X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJCSgweDI3NjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfN19UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCQkoMHgyNzcwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzBfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkJKDB4MjcwNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8xX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJCSgweDI3MTQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMl9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCQkoMHgyNzI0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzNfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkJKDB4MjczNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV80X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJCSgweDI3NDQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNV9UT0tFTl9CVUNLRVRfQ09ORklHKHBvcnQpCQkoMHgyNzU0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzZfVE9LRU5fQlVDS0VUX0NPTkZJRyhwb3J0KQkJKDB4Mjc2NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV83X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJCSgweDI3NzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMF9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3MDggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMV9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3MTggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMl9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3MjggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfM19BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3MzggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNF9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3NDggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNV9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3NTggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNl9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3NjggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfN19BUkJJVEVSX0NPTkZJRyhwb3J0KQkJCSgweDI3NzggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUE9SVF9UWF9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCQkoMHgyNzgwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RBX0ZJTFRFUl9TUEVDSUFMX01VTFRJQ0FTVF9UQUJMRV9CQVNFKHBvcnQpCSgweDM0MDAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFKHBvcnQpCQkoMHgzNTAwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UocG9ydCkJCQkoMHgzNjAwICsgKHBvcnQ8PDEwKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDdW5pdCBEZWJ1ZwkoZm9yIGludGVybmFsIHVzZSkgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVU5JVF9BRERSRVNTCQkJCQkgICAgMHhmMzQwCisjZGVmaW5lIENVTklUX0NPTU1BTkRfQU5EX0lECQkJCSAgICAweGYzNDQKKyNkZWZpbmUgQ1VOSVRfV1JJVEVfREFUQV9MT1cJCQkJICAgIDB4ZjM0OAorI2RlZmluZSBDVU5JVF9XUklURV9EQVRBX0hJR0gJCQkJICAgIDB4ZjM0YworI2RlZmluZSBDVU5JVF9XUklURV9CWVRFX0VOQUJMRQkJCQkgICAgMHhmMzU4CisjZGVmaW5lIENVTklUX1JFQURfREFUQV9MT1cJCQkJICAgIDB4ZjM1MAorI2RlZmluZSBDVU5JVF9SRUFEX0RBVEFfSElHSAkJCQkgICAgMHhmMzU0CisjZGVmaW5lIENVTklUX1JFQURfSUQJCQkJCSAgICAweGYzNWMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGYXN0IEV0aGVybmV0IFVuaXQgUmVnaXN0ZXJzCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICBFdGhlcm5ldCBVbml0IFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVUSF9QSFlfQUREUl9SRUcJCQkJMHgyMDAwCisjZGVmaW5lIEVUSF9TTUlfUkVHCQkJCQkJMHgyMDA0CisjZGVmaW5lIEVUSF9VTklUX0RFRkFVTFRfQUREUl9SRUcJCQkweDIwMDgKKyNkZWZpbmUgRVRIX1VOSVRfREVGQVVMVElEX1JFRwkJCQkweDIwMGMKKyNkZWZpbmUgRVRIX1VOSVRfSU5URVJSVVBUX0NBVVNFX1JFRwkJCTB4MjA4MAorI2RlZmluZSBFVEhfVU5JVF9JTlRFUlJVUFRfTUFTS19SRUcJCTB4MjA4NAorI2RlZmluZSBFVEhfVU5JVF9JTlRFUk5BTF9VU0VfUkVHCQkJMHgyNGZjCisjZGVmaW5lIEVUSF9VTklUX0VSUk9SX0FERFJfUkVHCQkJCTB4MjA5NAorI2RlZmluZSBFVEhfQkFSXzAJCQkJCQkweDIyMDAKKyNkZWZpbmUgRVRIX0JBUl8xCQkJCQkJMHgyMjA4CisjZGVmaW5lIEVUSF9CQVJfMgkJCQkJCTB4MjIxMAorI2RlZmluZSBFVEhfQkFSXzMJCQkJCQkweDIyMTgKKyNkZWZpbmUgRVRIX0JBUl80CQkJCQkJMHgyMjIwCisjZGVmaW5lIEVUSF9CQVJfNQkJCQkJCTB4MjIyOAorI2RlZmluZSBFVEhfU0laRV9SRUdfMAkJCQkJCTB4MjIwNAorI2RlZmluZSBFVEhfU0laRV9SRUdfMQkJCQkJCTB4MjIwYworI2RlZmluZSBFVEhfU0laRV9SRUdfMgkJCQkJCTB4MjIxNAorI2RlZmluZSBFVEhfU0laRV9SRUdfMwkJCQkJCTB4MjIxYworI2RlZmluZSBFVEhfU0laRV9SRUdfNAkJCQkJCTB4MjIyNAorI2RlZmluZSBFVEhfU0laRV9SRUdfNQkJCQkJCTB4MjIyYworI2RlZmluZSBFVEhfSEVBREVSU19SRVRBUkdFVF9CQVNFX1JFRwkJCTB4MjIzMAorI2RlZmluZSBFVEhfSEVBREVSU19SRVRBUkdFVF9DT05UUk9MX1JFRwkweDIyMzQKKyNkZWZpbmUgRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfMAkJCTB4MjI4MAorI2RlZmluZSBFVEhfSElHSF9BRERSX1JFTUFQX1JFR18xCQkweDIyODQKKyNkZWZpbmUgRVRIX0hJR0hfQUREUl9SRU1BUF9SRUdfMgkJMHgyMjg4CisjZGVmaW5lIEVUSF9ISUdIX0FERFJfUkVNQVBfUkVHXzMJCQkweDIyOGMKKyNkZWZpbmUgRVRIX0JBU0VfQUREUl9FTkFCTEVfUkVHCQkJMHgyMjkwCisjZGVmaW5lIEVUSF9BQ0NFU1NfUFJPVEVDVElPTl9SRUcocG9ydCkJCQkoMHgyMjk0ICsgKHBvcnQ8PDIpKQorI2RlZmluZSBFVEhfTUlCX0NPVU5URVJTX0JBU0UocG9ydCkJCQkoMHgzMDAwICsgKHBvcnQ8PDcpKQorI2RlZmluZSBFVEhfUE9SVF9DT05GSUdfUkVHKHBvcnQpCQkJKDB4MjQwMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX0NPTkZJR19FWFRFTkRfUkVHKHBvcnQpCQkoMHgyNDA0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX01JSV9TRVJJQUxfUEFSQU1FVFJTX1JFRyhwb3J0KQkJKDB4MjQwOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9HTUlJX1NFUklBTF9QQVJBTUVUUlNfUkVHKHBvcnQpCQkoMHgyNDBjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1ZMQU5fRVRIRVJUWVBFX1JFRyhwb3J0KQkJCSgweDI0MTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfTUFDX0FERFJfTE9XKHBvcnQpCQkJCQkoMHgyNDE0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX01BQ19BRERSX0hJR0gocG9ydCkJCQkJCSgweDI0MTggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfU0RNQV9DT05GSUdfUkVHKHBvcnQpCQkJKDB4MjQxYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9EU0NQXzAocG9ydCkJCQkJCSgweDI0MjAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfRFNDUF8xKHBvcnQpCQkJCQkoMHgyNDI0ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RTQ1BfMihwb3J0KQkJCQkJKDB4MjQyOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9EU0NQXzMocG9ydCkJCQkJCSgweDI0MmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfRFNDUF80KHBvcnQpCQkJCQkoMHgyNDMwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RTQ1BfNShwb3J0KQkJCQkJKDB4MjQzNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9EU0NQXzYocG9ydCkJCQkJCSgweDI0MzggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydCkJKDB4MjQzYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9WTEFOX1BSSU9SSVRZX1RBR19UT19QUklPUklUWShwb3J0KQkJKDB4MjQ0MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX1NUQVRVU19SRUcocG9ydCkJCQkJKDB4MjQ0NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhwb3J0KQkoMHgyNDQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFX0ZJWEVEX1BSSU9SSVRZKHBvcnQpCQkoMHgyNDRjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1BPUlRfVFhfVE9LRU5fQlVDS0VUX1JBVEVfQ09ORklHKHBvcnQpCSAgICgweDI0NTAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfTUFYSU1VTV9UUkFOU01JVF9VTklUKHBvcnQpCQkJKDB4MjQ1OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX01BWElNVU1fVE9LRU5fQlVDS0VUX1NJWkUocG9ydCkJICAgKDB4MjQ1YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnQpCQkJKDB4MjQ2MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0KQkJKDB4MjQ2NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydCkJCQkoMHgyNDY4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcocG9ydCkJCSgweDI0NmMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfRklGT19VUkdFTlRfVEhSRVNIT0xEX1JFRyhwb3J0KQkoMHgyNDcwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0ZJRk9fVVJHRU5UX1RIUkVTSE9MRF9SRUcocG9ydCkJKDB4MjQ3NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9NSU5JTUFMX0ZSQU1FX1NJWkVfUkVHKHBvcnQpCQkoMHgyNDdjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0RJU0NBUkRFRF9GUkFNRVNfQ09VTlRFUihwb3J0KQkoMHgyNDg0ICsgKHBvcnQ8PDEwKQorI2RlZmluZSBFVEhfUE9SVF9ERUJVR18wX1JFRyhwb3J0KQkJCQkoMHgyNDhjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1BPUlRfREVCVUdfMV9SRUcocG9ydCkJCQkJKDB4MjQ5MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9QT1JUX0lOVEVSTkFMX0FERFJfRVJST1JfUkVHKHBvcnQpCSgweDI0OTQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfSU5URVJOQUxfVVNFX1JFRyhwb3J0KQkJCQkoMHgyNGZjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcocG9ydCkJKDB4MjY4MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9DVVJSRU5UX1NFUlZFRF9UWF9ERVNDX1BUUihwb3J0KQkJKDB4MjY4NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzAocG9ydCkJCSgweDI2MGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8xKHBvcnQpCSgweDI2MWMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8yKHBvcnQpCQkoMHgyNjJjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMyhwb3J0KQkJKDB4MjYzYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzQocG9ydCkJCSgweDI2NGMgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUlhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl81KHBvcnQpCQkoMHgyNjVjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfNihwb3J0KQkJKDB4MjY2YyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9SWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzcocG9ydCkJCSgweDI2N2MgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wKHBvcnQpCSgweDI2YzAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8xKHBvcnQpCSgweDI2YzQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8yKHBvcnQpCSgweDI2YzggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8zKHBvcnQpCQkoMHgyNmNjICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfNChwb3J0KQkJKDB4MjZkMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9DVVJSRU5UX1FVRVVFX0RFU0NfUFRSXzUocG9ydCkJCSgweDI2ZDQgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl82KHBvcnQpCQkoMHgyNmQ4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfNyhwb3J0KQkJKDB4MjZkYyArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8wX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjcwMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8xX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjcxMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8yX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjcyMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8zX1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4MjczMCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV80X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc0MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV81X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc1MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV82X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc2MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV83X1RPS0VOX0JVQ0tFVF9DT1VOVChwb3J0KQkJICAgKDB4Mjc3MCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8wX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjcwNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8xX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjcxNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8yX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjcyNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8zX1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4MjczNCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV80X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc0NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV81X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc1NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV82X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc2NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV83X1RPS0VOX0JVQ0tFVF9DT05GSUcocG9ydCkJICAgKDB4Mjc3NCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8wX0FSQklURVJfQ09ORklHKHBvcnQpCQkoMHgyNzA4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzFfQVJCSVRFUl9DT05GSUcocG9ydCkJCSgweDI3MTggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfMl9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJKDB4MjcyOCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV8zX0FSQklURVJfQ09ORklHKHBvcnQpCQkoMHgyNzM4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzRfQVJCSVRFUl9DT05GSUcocG9ydCkJCSgweDI3NDggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfVFhfUVVFVUVfNV9BUkJJVEVSX0NPTkZJRyhwb3J0KQkJKDB4Mjc1OCArIChwb3J0PDwxMCkpCisjZGVmaW5lIEVUSF9UWF9RVUVVRV82X0FSQklURVJfQ09ORklHKHBvcnQpCQkoMHgyNzY4ICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX1RYX1FVRVVFXzdfQVJCSVRFUl9DT05GSUcocG9ydCkJCSgweDI3NzggKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfUE9SVF9UWF9UT0tFTl9CVUNLRVRfQ09VTlQocG9ydCkJCSgweDI3ODAgKyAocG9ydDw8MTApKQorI2RlZmluZSBFVEhfREFfRklMVEVSX1NQRUNJQUxfTVVMVElDQVNUX1RBQkxFX0JBU0UocG9ydCkgICAoMHgzNDAwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RBX0ZJTFRFUl9PVEhFUl9NVUxUSUNBU1RfVEFCTEVfQkFTRShwb3J0KQkgICAoMHgzNTAwICsgKHBvcnQ8PDEwKSkKKyNkZWZpbmUgRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UocG9ydCkJCSgweDM2MDAgKyAocG9ydDw8MTApKQorCisKKy8qIEV0aGVybmV0IEdUNjQyNjAgKi8KKy8qCisjZGVmaW5lIEVUSEVSTkVUX1BIWV9BRERSRVNTX1JFR0lTVEVSCQkJCQkweDIwMDAKKyNkZWZpbmUgRVRIRVJORVRfU01JX1JFR0lTVEVSCQkJCQkJCTB4MjAxMAorKi8KKy8qIEV0aGVybmV0IDAgKi8KKy8qCisjZGVmaW5lIEVUSEVSTkVUMF9QT1JUX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkJMHgyNDAwCisjZGVmaW5lIEVUSEVSTkVUMF9QT1JUX0NPTkZJR1VSQVRJT05fRVhURU5EX1JFR0lTVEVSCQkweDI0MDgKKyNkZWZpbmUgRVRIRVJORVQwX1BPUlRfQ09NTUFORF9SRUdJU1RFUgkJCQkJMHgyNDEwCisjZGVmaW5lIEVUSEVSTkVUMF9QT1JUX1NUQVRVU19SRUdJU1RFUgkJCQkJMHgyNDE4CisjZGVmaW5lIEVUSEVSTkVUMF9TRVJJQUxfUEFSQU1FVFJTX1JFR0lTVEVSCQkJCTB4MjQyMAorI2RlZmluZSBFVEhFUk5FVDBfSEFTSF9UQUJMRV9QT0lOVEVSX1JFR0lTVEVSCQkJCTB4MjQyOAorI2RlZmluZSBFVEhFUk5FVDBfRkxPV19DT05UUk9MX1NPVVJDRV9BRERSRVNTX0xPVwkJMHgyNDMwCisjZGVmaW5lIEVUSEVSTkVUMF9GTE9XX0NPTlRST0xfU09VUkNFX0FERFJFU1NfSElHSAkJMHgyNDM4CisjZGVmaW5lIEVUSEVSTkVUMF9TRE1BX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkweDI0NDAKKyNkZWZpbmUgRVRIRVJORVQwX1NETUFfQ09NTUFORF9SRUdJU1RFUgkJCQkJMHgyNDQ4CisjZGVmaW5lIEVUSEVSTkVUMF9JTlRFUlJVUFRfQ0FVU0VfUkVHSVNURVIJCQkJMHgyNDUwCisjZGVmaW5lIEVUSEVSTkVUMF9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUgkJCQkweDI0NTgKKyNkZWZpbmUgRVRIRVJORVQwX0ZJUlNUX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjAJCQkJMHgyNDgwCisjZGVmaW5lIEVUSEVSTkVUMF9GSVJTVF9SWF9ERVNDUklQVE9SX1BPSU5URVIxCQkJCTB4MjQ4NAorI2RlZmluZSBFVEhFUk5FVDBfRklSU1RfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMgkJCQkweDI0ODgKKyNkZWZpbmUgRVRIRVJORVQwX0ZJUlNUX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjMJCQkJMHgyNDhjCisjZGVmaW5lIEVUSEVSTkVUMF9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjAJCTB4MjRhMAorI2RlZmluZSBFVEhFUk5FVDBfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIxCQkweDI0YTQKKyNkZWZpbmUgRVRIRVJORVQwX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMgkJMHgyNGE4CisjZGVmaW5lIEVUSEVSTkVUMF9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjMJCTB4MjRhYworI2RlZmluZSBFVEhFUk5FVDBfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIwCQkweDI0ZTAKKyNkZWZpbmUgRVRIRVJORVQwX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSMQkJMHgyNGU0CisjZGVmaW5lIEVUSEVSTkVUMF9NSUJfQ09VTlRFUl9CQVNFCQkJCQkweDI1MDAKKyovCisvKiBFdGhlcm5ldCAxICovCisvKgorI2RlZmluZSBFVEhFUk5FVDFfUE9SVF9DT05GSUdVUkFUSU9OX1JFR0lTVEVSCQkJCTB4MjgwMAorI2RlZmluZSBFVEhFUk5FVDFfUE9SVF9DT05GSUdVUkFUSU9OX0VYVEVORF9SRUdJU1RFUgkJMHgyODA4CisjZGVmaW5lIEVUSEVSTkVUMV9QT1JUX0NPTU1BTkRfUkVHSVNURVIJCQkJCTB4MjgxMAorI2RlZmluZSBFVEhFUk5FVDFfUE9SVF9TVEFUVVNfUkVHSVNURVIJCQkJCTB4MjgxOAorI2RlZmluZSBFVEhFUk5FVDFfU0VSSUFMX1BBUkFNRVRSU19SRUdJU1RFUgkJCQkweDI4MjAKKyNkZWZpbmUgRVRIRVJORVQxX0hBU0hfVEFCTEVfUE9JTlRFUl9SRUdJU1RFUgkJCQkweDI4MjgKKyNkZWZpbmUgRVRIRVJORVQxX0ZMT1dfQ09OVFJPTF9TT1VSQ0VfQUREUkVTU19MT1cJCTB4MjgzMAorI2RlZmluZSBFVEhFUk5FVDFfRkxPV19DT05UUk9MX1NPVVJDRV9BRERSRVNTX0hJR0gJCTB4MjgzOAorI2RlZmluZSBFVEhFUk5FVDFfU0RNQV9DT05GSUdVUkFUSU9OX1JFR0lTVEVSCQkJMHgyODQwCisjZGVmaW5lIEVUSEVSTkVUMV9TRE1BX0NPTU1BTkRfUkVHSVNURVIJCQkJCTB4Mjg0OAorI2RlZmluZSBFVEhFUk5FVDFfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSCQkJCTB4Mjg1MAorI2RlZmluZSBFVEhFUk5FVDFfSU5URVJSVVBUX01BU0tfUkVHSVNURVIJCQkJMHgyODU4CisjZGVmaW5lIEVUSEVSTkVUMV9GSVJTVF9SWF9ERVNDUklQVE9SX1BPSU5URVIwCQkJCTB4Mjg4MAorI2RlZmluZSBFVEhFUk5FVDFfRklSU1RfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMQkJCQkweDI4ODQKKyNkZWZpbmUgRVRIRVJORVQxX0ZJUlNUX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjIJCQkJMHgyODg4CisjZGVmaW5lIEVUSEVSTkVUMV9GSVJTVF9SWF9ERVNDUklQVE9SX1BPSU5URVIzCQkJCTB4Mjg4YworI2RlZmluZSBFVEhFUk5FVDFfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIwCQkweDI4YTAKKyNkZWZpbmUgRVRIRVJORVQxX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMQkJMHgyOGE0CisjZGVmaW5lIEVUSEVSTkVUMV9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjIJCTB4MjhhOAorI2RlZmluZSBFVEhFUk5FVDFfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIzCQkweDI4YWMKKyNkZWZpbmUgRVRIRVJORVQxX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSMAkJMHgyOGUwCisjZGVmaW5lIEVUSEVSTkVUMV9DVVJSRU5UX1RYX0RFU0NSSVBUT1JfUE9JTlRFUjEJCTB4MjhlNAorI2RlZmluZSBFVEhFUk5FVDFfTUlCX0NPVU5URVJfQkFTRQkJCQkJMHgyOTAwCisqLworLyogRXRoZXJuZXQgMiAqLworLyoKKyNkZWZpbmUgRVRIRVJORVQyX1BPUlRfQ09ORklHVVJBVElPTl9SRUdJU1RFUgkJCQkweDJjMDAKKyNkZWZpbmUgRVRIRVJORVQyX1BPUlRfQ09ORklHVVJBVElPTl9FWFRFTkRfUkVHSVNURVIJCTB4MmMwOAorI2RlZmluZSBFVEhFUk5FVDJfUE9SVF9DT01NQU5EX1JFR0lTVEVSCQkJCQkweDJjMTAKKyNkZWZpbmUgRVRIRVJORVQyX1BPUlRfU1RBVFVTX1JFR0lTVEVSCQkJCQkweDJjMTgKKyNkZWZpbmUgRVRIRVJORVQyX1NFUklBTF9QQVJBTUVUUlNfUkVHSVNURVIJCQkJMHgyYzIwCisjZGVmaW5lIEVUSEVSTkVUMl9IQVNIX1RBQkxFX1BPSU5URVJfUkVHSVNURVIJCQkJMHgyYzI4CisjZGVmaW5lIEVUSEVSTkVUMl9GTE9XX0NPTlRST0xfU09VUkNFX0FERFJFU1NfTE9XCQkweDJjMzAKKyNkZWZpbmUgRVRIRVJORVQyX0ZMT1dfQ09OVFJPTF9TT1VSQ0VfQUREUkVTU19ISUdICQkweDJjMzgKKyNkZWZpbmUgRVRIRVJORVQyX1NETUFfQ09ORklHVVJBVElPTl9SRUdJU1RFUgkJCTB4MmM0MAorI2RlZmluZSBFVEhFUk5FVDJfU0RNQV9DT01NQU5EX1JFR0lTVEVSCQkJCQkweDJjNDgKKyNkZWZpbmUgRVRIRVJORVQyX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUgkJCQkweDJjNTAKKyNkZWZpbmUgRVRIRVJORVQyX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSCQkJCTB4MmM1OAorI2RlZmluZSBFVEhFUk5FVDJfRklSU1RfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMAkJCQkweDJjODAKKyNkZWZpbmUgRVRIRVJORVQyX0ZJUlNUX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjEJCQkJMHgyYzg0CisjZGVmaW5lIEVUSEVSTkVUMl9GSVJTVF9SWF9ERVNDUklQVE9SX1BPSU5URVIyCQkJCTB4MmM4OAorI2RlZmluZSBFVEhFUk5FVDJfRklSU1RfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMwkJCQkweDJjOGMKKyNkZWZpbmUgRVRIRVJORVQyX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMAkJMHgyY2EwCisjZGVmaW5lIEVUSEVSTkVUMl9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjEJCTB4MmNhNAorI2RlZmluZSBFVEhFUk5FVDJfQ1VSUkVOVF9SWF9ERVNDUklQVE9SX1BPSU5URVIyCQkweDJjYTgKKyNkZWZpbmUgRVRIRVJORVQyX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSMwkJMHgyY2FjCisjZGVmaW5lIEVUSEVSTkVUMl9DVVJSRU5UX1RYX0RFU0NSSVBUT1JfUE9JTlRFUjAJCTB4MmNlMAorI2RlZmluZSBFVEhFUk5FVDJfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIxCQkweDJjZTQKKyNkZWZpbmUgRVRIRVJORVQyX01JQl9DT1VOVEVSX0JBU0UJCQkJCTB4MmQwMAorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBTRE1BIFJlZ2lzdGVycwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTRE1BX0dST1VQX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkweGIxZjAKKyNkZWZpbmUgQ0hBTk5FTDBfQ09ORklHVVJBVElPTl9SRUdJU1RFUgkJCQkweDQwMDAKKyNkZWZpbmUgQ0hBTk5FTDBfQ09NTUFORF9SRUdJU1RFUgkJCQkweDQwMDgKKyNkZWZpbmUgQ0hBTk5FTDBfUlhfQ01EX1NUQVRVUwkJCQkJMHg0ODAwCisjZGVmaW5lIENIQU5ORUwwX1JYX1BBQ0tFVF9BTkRfQlVGRkVSX1NJWkVTCQkgICAgMHg0ODA0CisjZGVmaW5lIENIQU5ORUwwX1JYX0JVRkZFUl9QT0lOVEVSCQkJCTB4NDgwOAorI2RlZmluZSBDSEFOTkVMMF9SWF9ORVhUX1BPSU5URVIJCQkJMHg0ODBjCisjZGVmaW5lIENIQU5ORUwwX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDQ4MTAKKyNkZWZpbmUgQ0hBTk5FTDBfVFhfQ01EX1NUQVRVUwkJCQkJMHg0QzAwCisjZGVmaW5lIENIQU5ORUwwX1RYX1BBQ0tFVF9TSVpFCQkJCQkweDRDMDQKKyNkZWZpbmUgQ0hBTk5FTDBfVFhfQlVGRkVSX1BPSU5URVIJCQkJMHg0QzA4CisjZGVmaW5lIENIQU5ORUwwX1RYX05FWFRfUE9JTlRFUgkJCQkweDRDMGMKKyNkZWZpbmUgQ0hBTk5FTDBfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIJCTB4NGMxMAorI2RlZmluZSBDSEFOTkVMMF9GSVJTVF9UWF9ERVNDUklQVE9SX1BPSU5URVIJCQkweDRjMTQKKy8qCisjZGVmaW5lIENIQU5ORUwxX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkJMHg1MDAwCisjZGVmaW5lIENIQU5ORUwxX0NPTU1BTkRfUkVHSVNURVIJCQkJMHg1MDA4CisjZGVmaW5lIENIQU5ORUwxX1JYX0NNRF9TVEFUVVMJCQkJCTB4NTgwMAorI2RlZmluZSBDSEFOTkVMMV9SWF9QQUNLRVRfQU5EX0JVRkZFUl9TSVpFUwkJICAgIDB4NTgwNAorI2RlZmluZSBDSEFOTkVMMV9SWF9CVUZGRVJfUE9JTlRFUgkJCQkweDU4MDgKKyNkZWZpbmUgQ0hBTk5FTDFfUlhfTkVYVF9QT0lOVEVSCQkJCTB4NTgwYworI2RlZmluZSBDSEFOTkVMMV9UWF9DTURfU1RBVFVTCQkJCQkweDVDMDAKKyNkZWZpbmUgQ0hBTk5FTDFfVFhfUEFDS0VUX1NJWkUJCQkJCTB4NUMwNAorI2RlZmluZSBDSEFOTkVMMV9UWF9CVUZGRVJfUE9JTlRFUgkJCQkweDVDMDgKKyNkZWZpbmUgQ0hBTk5FTDFfVFhfTkVYVF9QT0lOVEVSCQkJCTB4NUMwYworI2RlZmluZSBDSEFOTkVMMV9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUgkJMHg1ODEwCisjZGVmaW5lIENIQU5ORUwxX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDVjMTAKKyNkZWZpbmUgQ0hBTk5FTDFfRklSU1RfVFhfREVTQ1JJUFRPUl9QT0lOVEVSCQkJMHg1YzE0CisjZGVmaW5lIENIQU5ORUwyX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkJMHg2MDAwCisjZGVmaW5lIENIQU5ORUwyX0NPTU1BTkRfUkVHSVNURVIJCQkJMHg2MDA4CisjZGVmaW5lIENIQU5ORUwyX1JYX0NNRF9TVEFUVVMJCQkJCTB4NjgwMAorI2RlZmluZSBDSEFOTkVMMl9SWF9QQUNLRVRfQU5EX0JVRkZFUl9TSVpFUwkJICAgIDB4NjgwNAorI2RlZmluZSBDSEFOTkVMMl9SWF9CVUZGRVJfUE9JTlRFUgkJCQkweDY4MDgKKyNkZWZpbmUgQ0hBTk5FTDJfUlhfTkVYVF9QT0lOVEVSCQkJCTB4NjgwYworI2RlZmluZSBDSEFOTkVMMl9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUgkJMHg2ODEwCisjZGVmaW5lIENIQU5ORUwyX1RYX0NNRF9TVEFUVVMJCQkJCTB4NkMwMAorI2RlZmluZSBDSEFOTkVMMl9UWF9QQUNLRVRfU0laRQkJCQkJMHg2QzA0CisjZGVmaW5lIENIQU5ORUwyX1RYX0JVRkZFUl9QT0lOVEVSCQkJCTB4NkMwOAorI2RlZmluZSBDSEFOTkVMMl9UWF9ORVhUX1BPSU5URVIJCQkJMHg2QzBjCisjZGVmaW5lIENIQU5ORUwyX0NVUlJFTlRfUlhfREVTQ1JJUFRPUl9QT0lOVEVSCQkweDY4MTAKKyNkZWZpbmUgQ0hBTk5FTDJfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIJCQkweDZjMTAKKyNkZWZpbmUgQ0hBTk5FTDJfRklSU1RfVFhfREVTQ1JJUFRPUl9QT0lOVEVSCQkJMHg2YzE0CisqLworLyogU0RNQSBJbnRlcnJ1cHQgKi8KKy8qCisjZGVmaW5lIFNETUFfQ0FVU0UJCQkJCQkJMHhiODIwCisjZGVmaW5lIFNETUFfTUFTSwkJCQkJCQkweGI4YTAKKyovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgIFNETUEgUmVnaXN0ZXJzCSAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTRE1BX0NPTkZJR19SRUcoY2hhbm5lbCkJCQkJCSgweDQwMDAgKyAoY2hhbm5lbDw8MTMpKQorI2RlZmluZSBTRE1BX0NPTU1BTkRfUkVHKGNoYW5uZWwpCQkJCQkoMHg0MDA4ICsgKGNoYW5uZWw8PDEzKSkKKyNkZWZpbmUgU0RNQV9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUihjaGFubmVsKQkJKDB4NDgxMCArIChjaGFubmVsPDwxMykpCisjZGVmaW5lIFNETUFfQ1VSUkVOVF9UWF9ERVNDUklQVE9SX1BPSU5URVIoY2hhbm5lbCkJKDB4NGMxMCArIChjaGFubmVsPDwxMykpCisjZGVmaW5lIFNETUFfRklSU1RfVFhfREVTQ1JJUFRPUl9QT0lOVEVSKGNoYW5uZWwpCSgweDRjMTQgKyAoY2hhbm5lbDw8MTMpKQorCisjZGVmaW5lIFNETUFfQ0FVU0VfUkVHCQkJCQkJCTB4YjgwMAorI2RlZmluZSBTRE1BX01BU0tfUkVHCQkJCQkJCTB4Yjg4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJhdWRlIFJhdGUgR2VuZXJhdG9ycyBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCUkcgMCAqLworI2RlZmluZSBCUkcwX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCTB4YjIwMAorI2RlZmluZSBCUkcwX0JBVURFX1RVTklOR19SRUdJU1RFUgkJCSAweGIyMDQKKworLyogQlJHIDEgKi8KKyNkZWZpbmUgQlJHMV9DT05GSUdVUkFUSU9OX1JFR0lTVEVSCQkJMHhiMjA4CisjZGVmaW5lIEJSRzFfQkFVREVfVFVOSU5HX1JFR0lTVEVSCQkJIDB4YjIwYworCisvKiBCUkcgMiAqLworI2RlZmluZSBCUkcyX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJCQkweGIyMTAKKyNkZWZpbmUgQlJHMl9CQVVERV9UVU5JTkdfUkVHSVNURVIJCQkgMHhiMjE0CisKKy8qIEJSRyBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEJSR19DQVVTRV9SRUdJU1RFUgkJCQkJMHhiODM0CisjZGVmaW5lIEJSR19NQVNLX1JFR0lTVEVSCQkJCQkweGI4YjQKKyNkZWZpbmUgQlJHX0NPTkZJR19SRUcoYnJnKQkJCQkJKDB4YjIwMCArIChicmc8PDMpKQorI2RlZmluZSBCUkdfQkFVREVfVFVOSU5HX1JFRyhicmcpCQkJCSgweGIyMDggKyAoYnJnPDwzKSkKKyNkZWZpbmUgQlJHX0NBVVNFX1JFRwkJCQkJCUJSR19DQVVTRV9SRUdJU1RFUiAgLyoweGI4MzQxICovCisjZGVmaW5lIEJSR19NQVNLX1JFRwkJCQkJCUJSR19NQVNLX1JFR0lTVEVSICAvKjB4YjhiNDEgKi8KKworLyogTUlTQyAqLworCisjZGVmaW5lIE1BSU5fUk9VVElOR19SRUdJU1RFUgkJCQkJCTB4YjQwMAorI2RlZmluZSBSRUNFSVZFX0NMT0NLX1JPVVRJTkdfUkVHSVNURVIJCQkJMHhiNDA0CisjZGVmaW5lIFRSQU5TTUlUX0NMT0NLX1JPVVRJTkdfUkVHSVNURVIJCQkJMHhiNDA4CisjZGVmaW5lIENPTU1fVU5JVF9BUkJJVEVSX0NPTkZJR1VSQVRJT05fUkVHSVNURVIJMHhiNDBjCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgV2F0Y2hkb2cgcmVnaXN0ZXJzCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBXQVRDSERPR19DT05GSUdVUkFUSU9OX1JFR0lTVEVSCQkJMHhiNDEwCisjZGVmaW5lIFdBVENIRE9HX1ZBTFVFX1JFR0lTVEVSCQkJCQkweGI0MTQKKyNkZWZpbmUgV0FUQ0hET0dfQ09ORklHX1JFRwkJCQkJV0FUQ0hET0dfQ09ORklHVVJBVElPTl9SRUdJU1RFUgkgLyoweGI0MTAxICovCisjZGVmaW5lIFdBVENIRE9HX1ZBTFVFX1JFRwkJCQkJCVdBVENIRE9HX1ZBTFVFX1JFR0lTVEVSCSAvKjB4YjQxNDEgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZsZXggVERNIFJlZ2lzdGVycwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRlRETSBQb3J0ICovCisKKyNkZWZpbmUgRkxFWFRETV9UUkFOU01JVF9SRUFEX1BPSU5URVIJCQkgICAgMHhhODAwCisjZGVmaW5lIEZMRVhURE1fUkVDRUlWRV9SRUFEX1BPSU5URVIJCQkgICAgMHhhODA0CisjZGVmaW5lIEZMRVhURE1fQ09ORklHVVJBVElPTl9SRUdJU1RFUgkJCSAgICAweGE4MDgKKyNkZWZpbmUgRkxFWFRETV9BVVhfQ0hBTk5FTEFfVFhfUkVHSVNURVIJCSAgICAweGE4MGMKKyNkZWZpbmUgRkxFWFRETV9BVVhfQ0hBTk5FTEFfUlhfUkVHSVNURVIJCSAgICAweGE4MTAKKyNkZWZpbmUgRkxFWFRETV9BVVhfQ0hBTk5FTEJfVFhfUkVHSVNURVIJCSAgICAweGE4MTQKKyNkZWZpbmUgRkxFWFRETV9BVVhfQ0hBTk5FTEJfUlhfUkVHSVNURVIJCSAgICAweGE4MTgKKworLyogRlRETSBJbnRlcnJ1cHRzICovCisKKyNkZWZpbmUgRlRETV9DQVVTRV9SRUdJU1RFUgkJCQkgICAgMHhiODMwCisjZGVmaW5lIEZURE1fTUFTS19SRUdJU1RFUgkJCQkgICAgMHhiOGIwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHUFAgSW50ZXJmYWNlIFJlZ2lzdGVycwkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEdQUF9JT19DT05UUk9MCQkJCQkJMHhmMTAwCisjZGVmaW5lIEdQUF9MRVZFTF9DT05UUk9MCQkJCQkweGYxMTAKKyNkZWZpbmUgR1BQX1ZBTFVFCQkJCQkJMHhmMTA0CisjZGVmaW5lIEdQUF9JTlRFUlJVUFRfQ0FVU0UJCQkJCTB4ZjEwOAorI2RlZmluZSBHUFBfSU5URVJSVVBUX01BU0sJCQkJCTB4ZjEwYworI2RlZmluZSBHUFBfSU5URVJSVVBUX01BU0swCQkJCQlHUFBfSU5URVJSVVBUX01BU0sgIC8qIDB4ZjEwYzEgKi8KKyNkZWZpbmUgR1BQX0lOVEVSUlVQVF9NQVNLMQkJCQkJMHhmMTE0CisjZGVmaW5lIEdQUF9WQUxVRV9TRVQJCQkJCQkweGYxMTgKKyNkZWZpbmUgR1BQX1ZBTFVFX0NMRUFSCQkJCQkJMHhmMTFjCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJTVBQIEludGVyZmFjZSBSZWdpc3RlcnMJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVBQX0NPTlRST0wwCQkJCQkJMHhmMDAwCisjZGVmaW5lIE1QUF9DT05UUk9MMQkJCQkJCTB4ZjAwNAorI2RlZmluZSBNUFBfQ09OVFJPTDIJCQkJCQkweGYwMDgKKyNkZWZpbmUgTVBQX0NPTlRST0wzCQkJCQkJMHhmMDBjCisjZGVmaW5lIERFQlVHX1BPUlRfTVVMVElQTEVYCQkJCQkweGYwMTQKKyAvKiNkZWZpbmUgU0VSSUFMX1BPUlRfTVVMVElQTEVYCQkJICAgICAgIDB4ZjAxMDEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBSZWdpc3RlcnMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdHMJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnRlcnJ1cHRzIChjaGVja2VkIEkuQS4gMTQuMTAuMDIpCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMT1dfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSCQkJMHgwMDQgIC8qIGd0NjQyNjA6IDB4YzE4MSAqLworI2RlZmluZSBISUdIX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUgkJCTB4MDBjICAvKiBndDY0MjYwOiAweGM2ODEgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9NQVNLX1JFR0lTVEVSX0xPVwkJMHgwMTQgIC8qIGd0NjQyNjA6IDB4YzFjMSAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUX01BU0tfUkVHSVNURVJfSElHSAkJMHgwMWMgIC8qIGd0NjQyNjA6IDB4YzZjMSAqLworI2RlZmluZSBDUFVfU0VMRUNUX0NBVVNFX1JFR0lTVEVSCQkJMHgwMjQgIC8qIGd0NjQyNjA6IDB4YzcwMSAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUXzFfTUFTS19SRUdJU1RFUl9MT1cJCTB4MDM0ICAvKiBuZXcgaW4gdGhlIE1WNjQzNjAgYW5kIE1WNjQ0NjAgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF8xX01BU0tfUkVHSVNURVJfSElHSAkJMHgwM2MgIC8qIG5ldyBpbiB0aGUgTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworI2RlZmluZSBDUFVfU0VMRUNUXzFfQ0FVU0VfUkVHSVNURVIJCQkweDA0NCAgLyogbmV3IGluIHRoZSBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisjZGVmaW5lIFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfTE9XCTB4MDU0ICAvKiBndDY0MjYwOiAweGMyNDEgKi8KKyNkZWZpbmUgUENJXzBJTlRFUlJVUFRfQ0FVU0VfTUFTS19SRUdJU1RFUl9ISUdIIDB4MDVjICAvKiBndDY0MjYwOiAweGM2NDEgKi8KKyNkZWZpbmUgUENJXzBTRUxFQ1RfQ0FVU0UJCQkJCQkweDA2NCAgLyogZ3Q2NDI2MDogMHhjNzQxICovCisjZGVmaW5lIFBDSV8xSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfTE9XCTB4MDc0ICAvKiBndDY0MjYwOiAweGNhNDEgKi8KKyNkZWZpbmUgUENJXzFJTlRFUlJVUFRfQ0FVU0VfTUFTS19SRUdJU1RFUl9ISUdIIDB4MDdjICAvKiBndDY0MjYwOiAweGNlNDEgKi8KKyNkZWZpbmUgUENJXzFTRUxFQ1RfQ0FVU0UJCQkJCQkweDA4NCAgLyogZ3Q2NDI2MDogMHhjZjQxICovCisvKiNkZWZpbmUgQ1BVX0lOVF8wX01BU0sJCQkJCQkweGU2MCBzaWduYWwgaXMgbm90IG11bHRpcGxleGVkIG9uIE1QUCBpbiB0aGUgTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworLyojZGVmaW5lIENQVV9JTlRfMV9NQVNLCQkJCQkJMHhlNjQgc2lnbmFsIGlzIG5vdCBtdWx0aXBsZXhlZCBvbiBNUFAgaW4gdGhlIE1WNjQzNjAgYW5kIE1WNjQ0NjAgKi8KKy8qI2RlZmluZSBDUFVfSU5UXzJfTUFTSwkJCQkJCTB4ZTY4IHNpZ25hbCBpcyBub3QgbXVsdGlwbGV4ZWQgb24gTVBQIGluIHRoZSBNVjY0MzYwIGFuZCBNVjY0NDYwICovCisvKiNkZWZpbmUgQ1BVX0lOVF8zX01BU0sJCQkJCQkweGU2YyBzaWduYWwgaXMgbm90IG11bHRpcGxleGVkIG9uIE1QUCBpbiB0aGUgTVY2NDM2MCBhbmQgTVY2NDQ2MCAqLworCisjZGVmaW5lIE1BSU5fSU5URVJSVVBUX0NBVVNFX0xPVwkJCQlMT1dfSU5URVJSVVBUX0NBVVNFX1JFR0lTVEVSICAvKiAweDAwNDEgKi8KKyNkZWZpbmUgTUFJTl9JTlRFUlJVUFRfQ0FVU0VfSElHSAkJCQlISUdIX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUiAgLyogMHgwMGMxICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFQwX01BU0tfTE9XCQkJCUNQVV9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUl9MT1cJIC8qIDB4MDE0MSAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUMF9NQVNLX0hJR0gJCQlDUFVfSU5URVJSVVBUX01BU0tfUkVHSVNURVJfSElHSCAgLyoweDAxYzEgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVDBfU0VMRUNUX0NBVVNFCQkJQ1BVX1NFTEVDVF9DQVVTRV9SRUdJU1RFUiAgLyogMHgwMjQxICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFQxX01BU0tfTE9XCQkJCUNQVV9JTlRFUlJVUFRfMV9NQVNLX1JFR0lTVEVSX0xPVyAgLyogMHgwMzQxICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFQxX01BU0tfSElHSAkJCUNQVV9JTlRFUlJVUFRfMV9NQVNLX1JFR0lTVEVSX0hJR0ggIC8qIDB4MDNjMSAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUMV9TRUxFQ1RfQ0FVU0UJCQlDUFVfU0VMRUNUXzFfQ0FVU0VfUkVHSVNURVIgIC8qIDB4MDQ0MSAqLworI2RlZmluZSBJTlRFUlJVUFQwX01BU0tfMF9MT1cJCQkJUENJXzBJTlRFUlJVUFRfQ0FVU0VfTUFTS19SRUdJU1RFUl9MT1cgLyogMHgwNTQxICovCisjZGVmaW5lIElOVEVSUlVQVDBfTUFTS18wX0hJR0gJCQkJCVBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfSElHSAkgLyogMHgwNWMxICovCisjZGVmaW5lIElOVEVSUlVQVDBfU0VMRUNUX0NBVVNFCQkJCVBDSV8wU0VMRUNUX0NBVVNFICAvKiAweDA2NDEgKi8KKyNkZWZpbmUgSU5URVJSVVBUMV9NQVNLXzBfTE9XCQkJCQlQQ0lfMUlOVEVSUlVQVF9DQVVTRV9NQVNLX1JFR0lTVEVSX0xPVwkvKiAweDA3NDEgKi8KKyNkZWZpbmUgSU5URVJSVVBUMV9NQVNLXzBfSElHSAkJCQkJUENJXzFJTlRFUlJVUFRfQ0FVU0VfTUFTS19SRUdJU1RFUl9ISUdICSAvKiAweDA3YzEgKi8KKyNkZWZpbmUgSU5URVJSVVBUMV9TRUxFQ1RfQ0FVU0UJCQkJUENJXzFTRUxFQ1RfQ0FVU0UgIC8qIDB4MDg0MSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEkyQyBSZWdpc3RlcnMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSTJDX1NMQVZFX0FERFJFU1MJCQkJCTB4YzAwMAorI2RlZmluZSBJMkNfRVhURU5ERURfU0xBVkVfQUREUkVTUwkJCTB4YzA0MAorI2RlZmluZSBJMkNfREFUQQkJCQkJCTB4YzAwNAorI2RlZmluZSBJMkNfQ09OVFJPTAkJCQkJCTB4YzAwOAorI2RlZmluZSBJMkNfU1RBVFVTX0JBVURFX1JBVEUJCQkJCTB4YzAwQworI2RlZmluZSBJMkNfU09GVF9SRVNFVAkJCQkJCTB4YzAxYworI2RlZmluZSBJMkNfU0xBVkVfQUREUgkJCQkJCUkyQ19TTEFWRV9BRERSRVNTICAvKiAweGMwMDAxICovCisjZGVmaW5lIEkyQ19FWFRFTkRFRF9TTEFWRV9BRERSCQkJCQlJMkNfRVhURU5ERURfU0xBVkVfQUREUkVTUyAgLyoweGMwMTAxICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTVBTQyBSZWdpc3RlcnMJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiAgTVBTQ3MgQ2xvY2tzIFJvdXRpbmcgUmVnaXN0ZXJzICAqLworCisjZGVmaW5lIE1QU0NfUk9VVElOR19SRUcJCQkJCTB4YjQwMAorI2RlZmluZSBNUFNDX1JYX0NMT0NLX1JPVVRJTkdfUkVHCQkJMHhiNDA0CisjZGVmaW5lIE1QU0NfVFhfQ0xPQ0tfUk9VVElOR19SRUcJCQkweGI0MDgKKworCS8qICBNUFNDcyBJbnRlcnJ1cHRzIFJlZ2lzdGVycwkgICovCisKKyNkZWZpbmUgTVBTQ19DQVVTRV9SRUcocG9ydCkJCQkJCSgweGI4MDQgKyAocG9ydDw8MykpCisjZGVmaW5lIE1QU0NfTUFTS19SRUcocG9ydCkJCQkJCSgweGI4ODQgKyAocG9ydDw8MykpCisKKyNkZWZpbmUgTVBTQ19NQUlOX0NPTkZJR19MT1cocG9ydCkJCQkoMHg4MDAwICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVBTQ19NQUlOX0NPTkZJR19ISUdIKHBvcnQpCQkJKDB4ODAwNCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1QU0NfUFJPVE9DT0xfQ09ORklHKHBvcnQpCQkJKDB4ODAwOCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1QU0NfQ0hBTk5FTF9SRUcxKHBvcnQpCQkJCQkoMHg4MDBjICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVBTQ19DSEFOTkVMX1JFRzIocG9ydCkJCQkJCSgweDgwMTAgKyAocG9ydDw8MTIpKQorI2RlZmluZSBNUFNDX0NIQU5ORUxfUkVHMyhwb3J0KQkJCQkJKDB4ODAxNCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1QU0NfQ0hBTk5FTF9SRUc0KHBvcnQpCQkJCQkoMHg4MDE4ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVBTQ19DSEFOTkVMX1JFRzUocG9ydCkJCQkJCSgweDgwMWMgKyAocG9ydDw8MTIpKQorI2RlZmluZSBNUFNDX0NIQU5ORUxfUkVHNihwb3J0KQkJCQkJKDB4ODAyMCArIChwb3J0PDwxMikpCisjZGVmaW5lIE1QU0NfQ0hBTk5FTF9SRUc3KHBvcnQpCQkJCQkoMHg4MDI0ICsgKHBvcnQ8PDEyKSkKKyNkZWZpbmUgTVBTQ19DSEFOTkVMX1JFRzgocG9ydCkJCQkJCSgweDgwMjggKyAocG9ydDw8MTIpKQorI2RlZmluZSBNUFNDX0NIQU5ORUxfUkVHOShwb3J0KQkJCQkJKDB4ODAyYyArIChwb3J0PDwxMikpCisjZGVmaW5lIE1QU0NfQ0hBTk5FTF9SRUcxMChwb3J0KQkJCQkoMHg4MDMwICsgKHBvcnQ8PDEyKSkKKworCisvKiBNUFNDMCAgKi8KKworI2RlZmluZSBNUFNDMF9NQUlOX0NPTkZJR1VSQVRJT05fTE9XCQkJICAgIDB4ODAwMAorI2RlZmluZSBNUFNDMF9NQUlOX0NPTkZJR1VSQVRJT05fSElHSAkJCSAgICAweDgwMDQKKyNkZWZpbmUgTVBTQzBfUFJPVE9DT0xfQ09ORklHVVJBVElPTgkJCSAgICAweDgwMDgKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVIxCQkJCSAgICAweDgwMGMKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVIyCQkJCSAgICAweDgwMTAKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVIzCQkJCSAgICAweDgwMTQKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI0CQkJCSAgICAweDgwMTgKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI1CQkJCSAgICAweDgwMWMKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI2CQkJCSAgICAweDgwMjAKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI3CQkJCSAgICAweDgwMjQKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI4CQkJCSAgICAweDgwMjgKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVI5CQkJCSAgICAweDgwMmMKKyNkZWZpbmUgQ0hBTk5FTDBfUkVHSVNURVIxMAkJCQkgICAgMHg4MDMwCisjZGVmaW5lIENIQU5ORUwwX1JFR0lTVEVSMTEJCQkJICAgIDB4ODAzNAorCisvKiBNUFNDMSAgKi8KKworI2RlZmluZSBNUFNDMV9NQUlOX0NPTkZJR1VSQVRJT05fTE9XCQkJICAgIDB4ODg0MAorI2RlZmluZSBNUFNDMV9NQUlOX0NPTkZJR1VSQVRJT05fSElHSAkJCSAgICAweDg4NDQKKyNkZWZpbmUgTVBTQzFfUFJPVE9DT0xfQ09ORklHVVJBVElPTgkJCSAgICAweDg4NDgKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVIxCQkJCSAgICAweDg4NGMKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVIyCQkJCSAgICAweDg4NTAKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVIzCQkJCSAgICAweDg4NTQKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI0CQkJCSAgICAweDg4NTgKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI1CQkJCSAgICAweDg4NWMKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI2CQkJCSAgICAweDg4NjAKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI3CQkJCSAgICAweDg4NjQKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI4CQkJCSAgICAweDg4NjgKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVI5CQkJCSAgICAweDg4NmMKKyNkZWZpbmUgQ0hBTk5FTDFfUkVHSVNURVIxMAkJCQkgICAgMHg4ODcwCisjZGVmaW5lIENIQU5ORUwxX1JFR0lTVEVSMTEJCQkJICAgIDB4ODg3NAorCisvKiBNUFNDMiAgKi8KKworI2RlZmluZSBNUFNDMl9NQUlOX0NPTkZJR1VSQVRJT05fTE9XCQkJICAgIDB4OTA0MAorI2RlZmluZSBNUFNDMl9NQUlOX0NPTkZJR1VSQVRJT05fSElHSAkJCSAgICAweDkwNDQKKyNkZWZpbmUgTVBTQzJfUFJPVE9DT0xfQ09ORklHVVJBVElPTgkJCSAgICAweDkwNDgKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVIxCQkJCSAgICAweDkwNGMKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVIyCQkJCSAgICAweDkwNTAKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVIzCQkJCSAgICAweDkwNTQKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI0CQkJCSAgICAweDkwNTgKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI1CQkJCSAgICAweDkwNWMKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI2CQkJCSAgICAweDkwNjAKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI3CQkJCSAgICAweDkwNjQKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI4CQkJCSAgICAweDkwNjgKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVI5CQkJCSAgICAweDkwNmMKKyNkZWZpbmUgQ0hBTk5FTDJfUkVHSVNURVIxMAkJCQkgICAgMHg5MDcwCisjZGVmaW5lIENIQU5ORUwyX1JFR0lTVEVSMTEJCQkJICAgIDB4OTA3NAorCisvKiBNUFNDcyBJbnRlcnVwdHMgICovCisKKyNkZWZpbmUgTVBTQzBfQ0FVU0UJCQkJCQkweGI4MjQKKyNkZWZpbmUgTVBTQzBfTUFTSwkJCQkJCTB4YjhhNAorI2RlZmluZSBNUFNDMV9DQVVTRQkJCQkJCTB4YjgyOAorI2RlZmluZSBNUFNDMV9NQVNLCQkJCQkJMHhiOGE4CisjZGVmaW5lIE1QU0MyX0NBVVNFCQkJCQkJMHhiODJjCisjZGVmaW5lIE1QU0MyX01BU0sJCQkJCQkgMHhiOGFjCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJICAgIENVTklUICBSZWdpc3RlcnMJCSAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCSAvKiBBZGRyZXNzIERlY29kaW5nIFJlZ2lzdGVyIE1hcCAqLworCisjZGVmaW5lIENVTklUX0JBU0VfQUREUl9SRUcwCQkJCQkweGYyMDAKKyNkZWZpbmUgQ1VOSVRfQkFTRV9BRERSX1JFRzEJCQkJCTB4ZjIwOAorI2RlZmluZSBDVU5JVF9CQVNFX0FERFJfUkVHMgkJCQkJMHhmMjEwCisjZGVmaW5lIENVTklUX0JBU0VfQUREUl9SRUczCQkJCQkweGYyMTgKKyNkZWZpbmUgQ1VOSVRfU0laRTAJCQkJCQkweGYyMDQKKyNkZWZpbmUgQ1VOSVRfU0laRTEJCQkJCQkweGYyMGMKKyNkZWZpbmUgQ1VOSVRfU0laRTIJCQkJCQkweGYyMTQKKyNkZWZpbmUgQ1VOSVRfU0laRTMJCQkJCQkweGYyMWMKKyNkZWZpbmUgQ1VOSVRfSElHSF9BRERSX1JFTUFQX1JFRzAJCQkweGYyNDAKKyNkZWZpbmUgQ1VOSVRfSElHSF9BRERSX1JFTUFQX1JFRzEJCQkweGYyNDQKKyNkZWZpbmUgQ1VOSVRfQkFTRV9BRERSX0VOQUJMRV9SRUcJCQkweGYyNTAKKyNkZWZpbmUgTVBTQzBfQUNDRVNTX1BST1RFQ1RJT05fUkVHCQkJMHhmMjU0CisjZGVmaW5lIE1QU0MxX0FDQ0VTU19QUk9URUNUSU9OX1JFRwkJCTB4ZjI1OAorI2RlZmluZSBDVU5JVF9JTlRFUk5BTF9TUEFDRV9CQVNFX0FERFJfUkVHCTB4ZjI1QworCisJLyogIEVycm9yIFJlcG9ydCBSZWdpc3RlcnMgICovCisKKyNkZWZpbmUgQ1VOSVRfSU5URVJSVVBUX0NBVVNFX1JFRwkJCTB4ZjMxMAorI2RlZmluZSBDVU5JVF9JTlRFUlJVUFRfTUFTS19SRUcJCQkweGYzMTQKKyNkZWZpbmUgQ1VOSVRfRVJST1JfQUREUgkJCQkJMHhmMzE4CisKKwkvKiAgQ3VuaXQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBDVU5JVF9BUkJJVEVSX0NPTlRST0xfUkVHCQkJMHhmMzAwCisjZGVmaW5lIENVTklUX0NPTkZJR19SRUcJCQkJCTB4YjQwYworI2RlZmluZSBDVU5JVF9DUlJPU0JBUl9USU1FT1VUX1JFRwkJCTB4ZjMwNAorCisJLyogIEN1bml0IERlYnVnIFJlZ2lzdGVycyAgICovCisKKyNkZWZpbmUgQ1VOSVRfREVCVUdfTE9XCQkJCQkJMHhmMzQwCisjZGVmaW5lIENVTklUX0RFQlVHX0hJR0gJCQkJCTB4ZjM0NAorI2RlZmluZSBDVU5JVF9NTUFTSwkJCQkJCTB4ZjM4MAorCisjZW5kaWYgLyogX19JTkNtdl9nZW5fcmVnaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvTWFydmVsbC9pbmNsdWRlL3BjaS5oIGIvYm9hcmQvTWFydmVsbC9pbmNsdWRlL3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzI0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9NYXJ2ZWxsL2luY2x1ZGUvcGNpLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qIFBDSS5oIC0gUENJIGZ1bmN0aW9ucyBoZWFkZXIgZmlsZSAqLworCisvKiBDb3B5cmlnaHQgLSBHYWxpbGVvIHRlY2hub2xvZ3kuICovCisKKyNpZm5kZWYgX19JTkNwY2loCisjZGVmaW5lIF9fSU5DcGNpaAorCisvKiBpbmNsdWRlcyAqLworCisjaW5jbHVkZSJjb3JlLmgiCisjaW5jbHVkZSJtZW1vcnkuaCIKKworLyogQWNjb3JkaW5nIHRvIFBDSSBSRVYgMi4xIE1BWCBhZ2VudHMgYWxsb3dlZCBvbiB0aGUgYnVzIGFyZSAtMjEtICovCisjZGVmaW5lIFBDSV9NQVhfREVWSUNFUyAyMgorCisKKy8qIE1hY3JvcyAqLworCisvKiBUaGUgbmV4dCBNYWNyb3MgY29uZmlndXJhdGUgdGhlIGluaXRpYXRvciBib2FyZCAoU0VMRikgb3IgYW55IGFueSBhZ2VudCBvbgorICAgdGhlIFBDSSB0byBiZWNvbWU6IE1BU1RFUiwgcmVzcG9uc2UgdG8gTUVNT1JZIHRyYW5zYWN0aW9ucyAsIHJlc3BvbnNlIHRvCisgICBJTyB0cmFuc2FjdGlvbnMgb3IgVFdPIGJvdGggTUVNT1JZX0lPIHRyYW5zYWN0aW9ucy4gVGhvc2UgY29uZmlndXJhdGlvbgorICAgYXJlIGZvciBib3RoIFBDSTAgYW5kIFBDSTEuICovCisKKyNkZWZpbmUgUENJX01FTU9SWV9FTkFCTEUoaG9zdCwgZGV2aWNlTnVtYmVyKSBwY2lXcml0ZUNvbmZpZ1JlZyhob3N0LAkgICAgICAgXAorCSAgUENJX1NUQVRVU19BTkRfQ09NTUFORCxkZXZpY2VOdW1iZXIsTUVNT1JZX0VOQUJMRSB8CQkgICAgIFwKKwkgIHBjaVJlYWRDb25maWdSZWcoaG9zdCwgUENJX1NUQVRVU19BTkRfQ09NTUFORCxkZXZpY2VOdW1iZXIpICkKKworI2RlZmluZSBQQ0lfSU9fRU5BQkxFKGhvc3QsIGRldmljZU51bWJlcikgcGNpV3JpdGVDb25maWdSZWcoaG9zdCwJICAgICAgIFwKKwkgIFBDSV9TVEFUVVNfQU5EX0NPTU1BTkQsZGV2aWNlTnVtYmVyLElfT19FTkFCTEUgfAkJICAgICBcCisJICBwY2lSZWFkQ29uZmlnUmVnKGhvc3QsIFBDSV9TVEFUVVNfQU5EX0NPTU1BTkQsZGV2aWNlTnVtYmVyKSApCisKKyNkZWZpbmUgUENJX1NMQVZFX0VOQUJMRShob3N0LCBkZXZpY2VOdW1iZXIpIHBjaVdyaXRlQ29uZmlnUmVnKGhvc3QsCSAgICAgICBcCisJICBQQ0lfU1RBVFVTX0FORF9DT01NQU5ELGRldmljZU51bWJlcixNRU1PUllfRU5BQkxFIHwgSV9PX0VOQUJMRSB8ICAgXAorCSAgcGNpUmVhZENvbmZpZ1JlZyhob3N0LCBQQ0lfU1RBVFVTX0FORF9DT01NQU5ELGRldmljZU51bWJlcikgKQorCisjZGVmaW5lIFBDSV9ESVNBQkxFKGhvc3QsIGRldmljZU51bWJlcikgcGNpV3JpdGVDb25maWdSZWcoaG9zdCwJCSAgICAgICBcCisJICBQQ0lfU1RBVFVTX0FORF9DT01NQU5ELGRldmljZU51bWJlciwweGZmZmZmZmY4ICAmCQkgICAgIFwKKwkgIHBjaVJlYWRDb25maWdSZWcoaG9zdCwgUENJX1NUQVRVU19BTkRfQ09NTUFORCxkZXZpY2VOdW1iZXIpKQorCisjZGVmaW5lIFBDSV9NQVNURVJfRU5BQkxFKGhvc3QsZGV2aWNlTnVtYmVyKSBwY2lXcml0ZUNvbmZpZ1JlZyhob3N0LAkgICAgICAgXAorCSAgUENJX1NUQVRVU19BTkRfQ09NTUFORCxkZXZpY2VOdW1iZXIsTUFTVEVSX0VOQUJMRSB8CQkgICAgIFwKKwkgIHBjaVJlYWRDb25maWdSZWcoaG9zdCxQQ0lfU1RBVFVTX0FORF9DT01NQU5ELGRldmljZU51bWJlcikgKQorCisjZGVmaW5lIFBDSV9NQVNURVJfRElTQUJMRShkZXZpY2VOdW1iZXIpIHBjaVdyaXRlQ29uZmlnUmVnKGhvc3QsCSAgICAgIFwKKwkgIFBDSV9TVEFUVVNfQU5EX0NPTU1BTkQsZGV2aWNlTnVtYmVyLH5NQVNURVJfRU5BQkxFICYJCSAgICAgXAorCSAgcGNpUmVhZENvbmZpZ1JlZyhob3N0LFBDSV9TVEFUVVNfQU5EX0NPTU1BTkQsZGV2aWNlTnVtYmVyKSApCisKKyNkZWZpbmUJCU1BU1RFUl9FTkFCTEUJCQlCSVQyCisjZGVmaW5lCQlNRU1PUllfRU5BQkxFCQkJQklUMQorI2RlZmluZQkJSV9PX0VOQUJMRQkJCUJJVDAKKyNkZWZpbmUJICAgIFNFTEYJCSAgICAzMgorCisvKiBBZ2VudCBvbiB0aGUgUENJIGJ1cyBtYXkgaGF2ZSB1cCB0byA2IEJBUlMuICovCisjZGVmaW5lCSAgICBCQVIwCQkgICAgMHgxMAorI2RlZmluZQkgICAgQkFSMQkJICAgIDB4MTQKKyNkZWZpbmUJICAgIEJBUjIJCSAgICAweDE4CisjZGVmaW5lCSAgICBCQVIzCQkgICAgMHgxYworI2RlZmluZQkgICAgQkFSNAkJICAgIDB4MjAKKyNkZWZpbmUJICAgIEJBUjUJCSAgICAweDI0CisjZGVmaW5lCQlCQVJfU0VMX01FTV9JTwkJCUJJVDAKKyNkZWZpbmUJCUJBUl9NRU1fVFlQRV8zMl9CSVQJCU5PX0JJVAorI2RlZmluZQkJQkFSX01FTV9UWVBFX0JFTE9XXzFNCQkgICAgICAgQklUMQorI2RlZmluZQkJQkFSX01FTV9UWVBFXzY0X0JJVAkJCSAgICAgIEJJVDIKKyNkZWZpbmUJCUJBUl9NRU1fVFlQRV9SRVNFUlZFRAkJICAgICAgKEJJVDEgfCBCSVQyKQorI2RlZmluZQkJQkFSX01FTV9UWVBFX01BU0sJCSAgICAgIChCSVQxIHwgQklUMikKKyNkZWZpbmUJCUJBUl9QUkVGRVRDSEFCTEUJCQkJICAgICAgQklUMworI2RlZmluZQkJQkFSX0NPTkZJR19NQVNLCQkJKEJJVDAgfCBCSVQxIHwgQklUMiB8IEJJVDMpCisKKy8qIERlZmluZXMgZm9yIHRoZSBhY2Nlc3MgcmVnaW9ucy4gKi8KKyNkZWZpbmUJICAgIFBSRUZFVENIX0VOQUJMRQkJICAgIEJJVDEyCisjZGVmaW5lCSAgICBQUkVGRVRDSF9ESVNBQkxFCQkgICAgTk9fQklUCisjZGVmaW5lCSAgICBERUxBWUVEX1JFQURfRU5BQkxFCQkgICAgQklUMTMKKy8qICNkZWZpbmUgICAgIENBQ0hJTkdfRU5BQkxFCQkgICAgICAgQklUMTQgKi8KKy8qIGFnZ3Jlc3NpdmUgcHJlZmV0Y2g6IFBDSSBzbGF2ZSBwcmVmZXRjaCB0d28gYnVyc3QgaW4gYWR2YW5jZSovCisjZGVmaW5lCSAgICBBR0dSRVNTSVZFX1BSRUZFVENICQkgICAgIEJJVDE2CisvKiByZWFkIGxpbmUgYWdncmVzaXZlIHByZWZldGNoOiBQQ0kgc2xhdmUgcHJlZmV0Y2ggdHdvIGJ1cnN0IGluIGFkdmFuY2UqLworI2RlZmluZQkgICAgUkVBRF9MSU5FX0FHR1JFU1NJVkVfUFJFRkVUQ0ggICBCSVQxNworLyogcmVhZCBtdWx0aXBsZSBhZ2dyZXNpdmUgcHJlZmV0Y2g6IFBDSSBzbGF2ZSBwcmVmZXRjaCB0d28gYnVyc3QgaW4gYWR2YW5jZSovCisjZGVmaW5lCSAgICBSRUFEX01VTFRJX0FHR1JFU1NJVkVfUFJFRkVUQ0ggIEJJVDE4CisjZGVmaW5lCSAgICBNQVhfQlVSU1RfNAkJCSAgICBOT19CSVQKKyNkZWZpbmUJICAgIE1BWF9CVVJTVF84CQkJICAgIEJJVDIwICAvKiBCaXRzWzIxOjIwXSA9IDAxICovCisjZGVmaW5lCSAgICBNQVhfQlVSU1RfMTYJCSAgICBCSVQyMSAgLyogQml0c1syMToyMF0gPSAxMCAqLworI2RlZmluZQkgICAgUENJX0JZVEVfU1dBUAkJICAgIE5PX0JJVCAvKiBCaXRzWzI1OjI0XSA9IDAwICovCisjZGVmaW5lCSAgICBQQ0lfTk9fU1dBUAkJCSAgICBCSVQyNCAgLyogQml0c1syNToyNF0gPSAwMSAqLworI2RlZmluZQkgICAgUENJX0JZVEVfQU5EX1dPUkRfU1dBUAkgICAgQklUMjUgIC8qIEJpdHNbMjU6MjRdID0gMTAgKi8KKyNkZWZpbmUJICAgIFBDSV9XT1JEX1NXQVAJCSAgIChCSVQyNCB8IEJJVDI1KSAvKiBCaXRzWzI1OjI0XSA9IDExICovCisjZGVmaW5lCSAgICBQQ0lfQUNDRVNTX1BST1RFQ1QJCSAgICBCSVQyOAorI2RlZmluZQkgICAgUENJX1dSSVRFX1BST1RFQ1QJCSAgICBCSVQyOQorCisvKiB0eXBlZGVmcyAqLworCit0eXBlZGVmIGVudW0gX19wY2lBY2Nlc3NSZWdpb25ze1JFR0lPTjAsUkVHSU9OMSxSRUdJT04yLFJFR0lPTjMsUkVHSU9ONCxSRUdJT041LAorCQkJCVJFR0lPTjYsUkVHSU9ON30gUENJX0FDQ0VTU19SRUdJT05TOworCit0eXBlZGVmIGVudW0gX19wY2lBZ2VudFByaW97TE9XX0FHRU5UX1BSSU8sSElfQUdFTlRfUFJJT30gUENJX0FHRU5UX1BSSU87Cit0eXBlZGVmIGVudW0gX19wY2lBZ2VudFBhcmt7UEFSS19PTl9BR0VOVCxET05UX1BBUktfT05fQUdFTlR9IFBDSV9BR0VOVF9QQVJLOworCit0eXBlZGVmIGVudW0gX19wY2lTbm9vcFR5cGV7UENJX05PX1NOT09QLFBDSV9TTk9PUF9XVCxQQ0lfU05PT1BfV0J9CisJCQkgICAgUENJX1NOT09QX1RZUEU7Cit0eXBlZGVmIGVudW0gX19wY2lTbm9vcFJlZ2lvbntQQ0lfU05PT1BfUkVHSU9OMCxQQ0lfU05PT1BfUkVHSU9OMSwKKwkJCSAgICAgIFBDSV9TTk9PUF9SRUdJT04yLFBDSV9TTk9PUF9SRUdJT04zfQorCQkJICAgICAgUENJX1NOT09QX1JFR0lPTjsKKwordHlwZWRlZiBlbnVtIF9fbWVtUGNpSG9zdHtQQ0lfSE9TVDAsUENJX0hPU1QxfSBQQ0lfSE9TVDsKK3R5cGVkZWYgZW51bSBfX21lbVBjaVJlZ2lvbntQQ0lfUkVHSU9OMCxQQ0lfUkVHSU9OMSwKKwkJCSBQQ0lfUkVHSU9OMixQQ0lfUkVHSU9OMywKKwkJCSBQQ0lfSU99CisJCQkgUENJX1JFR0lPTjsKKworLypyb25lbiA3L0RlYy8wMyAqLwordHlwZWRlZiBlbnVtIF9fcGNpX2Jhcl93aW5kb3dze1BDSV9DUzBfQkFSLCBQQ0lfQ1MxX0JBUiwgUENJX0NTMl9CQVIsCisJCQkgICAgICAgUENJX0NTM19CQVIsIFBDSV9ERVZfQ1MwX0JBUiwgUENJX0RFVl9DUzFfQkFSLAorCQkJICAgICAgIFBDSV9ERVZfQ1MyX0JBUiwgUENJX0RFVl9DUzNfQkFSLCBQQ0lfQk9PVF9DU19CQVIsCisJCQkgICAgICAgUENJX01FTV9JTlRfUkVHX0JBUiwgUENJX0lPX0lOVF9SRUdfQkFSLAorCQkJICAgICAgIFBDSV9QMlBfTUVNMF9CQVIsIFBDSV9QMlBfTUVNMV9CQVIsCisJCQkgICAgICAgUENJX1AyUF9JT19CQVIsIFBDSV9DUFVfQkFSLCBQQ0lfSU5UX1NSQU1fQkFSLAorCQkJICAgICAgIFBDSV9MQVNUX0JBUn0gUENJX0lOVEVSTkFMX0JBUjsKKwordHlwZWRlZiBzdHJ1Y3QgcGNpQmFyIHsKKyAgICB1bnNpZ25lZCBpbnQgZGV0ZWN0QmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgYmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgdHlwZTsKK30gUENJX0JBUjsKKwordHlwZWRlZiBzdHJ1Y3QgcGNpRGV2aWNlIHsKKyAgICBQQ0lfSE9TVAkgICAgIGhvc3Q7CisgICAgY2hhcgkgICAgdHlwZVs0MF07CisgICAgdW5zaWduZWQgaW50ICAgIGRldmljZU51bTsKKyAgICB1bnNpZ25lZCBpbnQgICAgdmVuSUQ7CisgICAgdW5zaWduZWQgaW50ICAgIGRldmljZUlEOworICAgIFBDSV9CQVIgYmFyWzZdOworfSBQQ0lfREVWSUNFOworCit0eXBlZGVmIHN0cnVjdCBwY2lTZWxmQmFycyB7CisgICAgdW5zaWduZWQgaW50ICAgIFNDUzBCYXNlOworICAgIHVuc2lnbmVkIGludCAgICBTQ1MwU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgU0NTMUJhc2U7CisgICAgdW5zaWduZWQgaW50ICAgIFNDUzFTaXplOworICAgIHVuc2lnbmVkIGludCAgICBTQ1MyQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgU0NTMlNpemU7CisgICAgdW5zaWduZWQgaW50ICAgIFNDUzNCYXNlOworICAgIHVuc2lnbmVkIGludCAgICBTQ1MzU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgaW50ZXJuYWxNZW1CYXNlOworICAgIHVuc2lnbmVkIGludCAgICBpbnRlcm5hbElPQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MwQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MwU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MxQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MxU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MyQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MyU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MzQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1MzU2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1NCb290QmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgQ1NCb290U2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgUDJQTWVtMEJhc2U7CisgICAgdW5zaWduZWQgaW50ICAgIFAyUE1lbTBTaXplOworICAgIHVuc2lnbmVkIGludCAgICBQMlBNZW0xQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgUDJQTWVtMVNpemU7CisgICAgdW5zaWduZWQgaW50ICAgIFAyUElPQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgUDJQSU9TaXplOworICAgIHVuc2lnbmVkIGludCAgICBDUFVCYXNlOworICAgIHVuc2lnbmVkIGludCAgICBDUFVTaXplOworfSBQQ0lfU0VMRl9CQVJTOworCisvKiByZWFkL3dyaXRlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIG9uIGxvY2FsIFBDSSBidXMuICovCit2b2lkIHBjaVdyaXRlQ29uZmlnUmVnKFBDSV9IT1NUIGhvc3QsIHVuc2lnbmVkIGludCByZWdPZmZzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpRGV2TnVtLCB1bnNpZ25lZCBpbnQgZGF0YSk7Cit1bnNpZ25lZCBpbnQgcGNpUmVhZENvbmZpZ1JlZyAoUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgaW50IHJlZ09mZnNldCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpRGV2TnVtKTsKKworLyogcmVhZC93cml0ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBvbiBhbm90aGVyIFBDSSBidXMuICovCit2b2lkIHBjaU92ZXJCcmlkZ2VXcml0ZUNvbmZpZ1JlZyhQQ0lfSE9TVCBob3N0LAorCQkJCSB1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorCQkJCSB1bnNpZ25lZCBpbnQgcGNpRGV2TnVtLAorCQkJCSB1bnNpZ25lZCBpbnQgYnVzTnVtLHVuc2lnbmVkIGludCBkYXRhKTsKK3Vuc2lnbmVkIGludCBwY2lPdmVyQnJpZGdlUmVhZENvbmZpZ1JlZyhQQ0lfSE9TVCBob3N0LAorCQkJCQl1bnNpZ25lZCBpbnQgcmVnT2Zmc2V0LAorCQkJCQl1bnNpZ25lZCBpbnQgcGNpRGV2TnVtLAorCQkJCQl1bnNpZ25lZCBpbnQgYnVzTnVtKTsKKworLyogUGVyZm9ybXMgZnVsbCBzY2FuZSBvbiBib3RoIFBDSSBhbmQgcmV0dXJucyBhbGwgZGV0YWlsIHBvc3NpYmxlIG9uIHRoZQorICAgYWdlbnRzIHdoaWNoIGV4aXN0IG9uIHRoZSBidXMuICovCit2b2lkIHBjaVNjYW5EZXZpY2VzKFBDSV9IT1NUIGhvc3QsIFBDSV9ERVZJQ0UgKnBjaTBEZXRlY3QsCisJCSAgICB1bnNpZ25lZCBpbnQgbnVtYmVyT2ZFbG1lbnQpOworCisvKglNYXN0ZXJgcyBtZW1vcnkgc3BhY2UJKi8KK2Jvb2wgcGNpTWFwU3BhY2UoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24sCisJCXVuc2lnbmVkIGludCByZW1hcEJhc2UsCisJCXVuc2lnbmVkIGludCBkZXZpY2VCYXNlLAorCQl1bnNpZ25lZCBpbnQgZGV2aWNlTGVuZ3RoKTsKK3Vuc2lnbmVkIGludCBwY2lHZXRTcGFjZUJhc2UoUENJX0hPU1QgaG9zdCwgUENJX1JFR0lPTiByZWdpb24pOwordW5zaWduZWQgaW50IHBjaUdldFNwYWNlU2l6ZShQQ0lfSE9TVCBob3N0LCBQQ0lfUkVHSU9OIHJlZ2lvbik7CisKKy8qCVNsYXZlYHMgbWVtb3J5IHNwYWNlICAgKi8KK3ZvaWQgcGNpTWFwTWVtb3J5QmFuayhQQ0lfSE9TVCBob3N0LCBNRU1PUllfQkFOSyBiYW5rLAorCQkgICAgICB1bnNpZ25lZCBpbnQgcGNpMERyYW0wQmFzZSwgdW5zaWduZWQgaW50IHBjaTBEcmFtMFNpemUpOworCisjaWYgMCAvKiBHQVJCQUdFIHJvdXRpbmVzIC0gZG9udCB1c2UgdGlsbCB0aGV5IGdldCBjbGVhbmVkIHVwICovCit2b2lkIHBjaTBTY2FuU2VsZkJhcnMoUENJX1NFTEZfQkFSUyAqcGNpMFNlbGZCYXJzKTsKK3ZvaWQgcGNpMVNjYW5TZWxmQmFycyhQQ0lfU0VMRl9CQVJTICpwY2kxU2VsZkJhcnMpOwordm9pZCBwY2kwTWFwSW50ZXJuYWxSZWdTcGFjZSh1bnNpZ25lZCBpbnQgcGNpMEludGVybmFsQmFzZSk7Cit2b2lkIHBjaTFNYXBJbnRlcm5hbFJlZ1NwYWNlKHVuc2lnbmVkIGludCBwY2kxSW50ZXJuYWxCYXNlKTsKK3ZvaWQgcGNpME1hcEludGVybmFsUmVnSU9TcGFjZSh1bnNpZ25lZCBpbnQgcGNpMEludGVybmFsQmFzZSk7Cit2b2lkIHBjaTFNYXBJbnRlcm5hbFJlZ0lPU3BhY2UodW5zaWduZWQgaW50IHBjaTFJbnRlcm5hbEJhc2UpOwordm9pZCBwY2kwTWFwRGV2aWNlME1lbW9yeVNwYWNlKHVuc2lnbmVkIGludCBwY2kwRGV2MEJhc2UsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBjaTBEZXYwTGVuZ3RoKTsKK3ZvaWQgcGNpMU1hcERldmljZTBNZW1vcnlTcGFjZSh1bnNpZ25lZCBpbnQgcGNpMURldjBCYXNlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwY2kxRGV2MExlbmd0aCk7Cit2b2lkIHBjaTBNYXBEZXZpY2UxTWVtb3J5U3BhY2UodW5zaWduZWQgaW50IHBjaTBEZXYxQmFzZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpMERldjFMZW5ndGgpOwordm9pZCBwY2kxTWFwRGV2aWNlMU1lbW9yeVNwYWNlKHVuc2lnbmVkIGludCBwY2kxRGV2MUJhc2UsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBjaTFEZXYxTGVuZ3RoKTsKK3ZvaWQgcGNpME1hcERldmljZTJNZW1vcnlTcGFjZSh1bnNpZ25lZCBpbnQgcGNpMERldjJCYXNlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwY2kwRGV2Mkxlbmd0aCk7Cit2b2lkIHBjaTFNYXBEZXZpY2UyTWVtb3J5U3BhY2UodW5zaWduZWQgaW50IHBjaTFEZXYyQmFzZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGNpMURldjJMZW5ndGgpOwordm9pZCBwY2kwTWFwRGV2aWNlM01lbW9yeVNwYWNlKHVuc2lnbmVkIGludCBwY2kwRGV2M0Jhc2UsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBjaTBEZXYzTGVuZ3RoKTsKK3ZvaWQgcGNpMU1hcERldmljZTNNZW1vcnlTcGFjZSh1bnNpZ25lZCBpbnQgcGNpMURldjNCYXNlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwY2kxRGV2M0xlbmd0aCk7Cit2b2lkIHBjaTBNYXBCb290RGV2aWNlTWVtb3J5U3BhY2UodW5zaWduZWQgaW50IHBjaTBEZXZCb290QmFzZSwKKwkJCQkgIHVuc2lnbmVkIGludCBwY2kwRGV2Qm9vdExlbmd0aCk7Cit2b2lkIHBjaTFNYXBCb290RGV2aWNlTWVtb3J5U3BhY2UodW5zaWduZWQgaW50IHBjaTFEZXZCb290QmFzZSwKKwkJCQkgIHVuc2lnbmVkIGludCBwY2kxRGV2Qm9vdExlbmd0aCk7Cit2b2lkIHBjaTBNYXBQMnBNZW0wU3BhY2UodW5zaWduZWQgaW50IHBjaTBQMnBNZW0wQmFzZSwKKwkJCSB1bnNpZ25lZCBpbnQgcGNpMFAycE1lbTBMZW5ndGgpOwordm9pZCBwY2kxTWFwUDJwTWVtMFNwYWNlKHVuc2lnbmVkIGludCBwY2kxUDJwTWVtMEJhc2UsCisJCQkgdW5zaWduZWQgaW50IHBjaTFQMnBNZW0wTGVuZ3RoKTsKK3ZvaWQgcGNpME1hcFAycE1lbTFTcGFjZSh1bnNpZ25lZCBpbnQgcGNpMFAycE1lbTFCYXNlLAorCQkJIHVuc2lnbmVkIGludCBwY2kwUDJwTWVtMUxlbmd0aCk7Cit2b2lkIHBjaTFNYXBQMnBNZW0xU3BhY2UodW5zaWduZWQgaW50IHBjaTFQMnBNZW0xQmFzZSwKKwkJCSB1bnNpZ25lZCBpbnQgcGNpMVAycE1lbTFMZW5ndGgpOwordm9pZCBwY2kwTWFwUDJwSW9TcGFjZSh1bnNpZ25lZCBpbnQgcGNpMFAycElvQmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBwY2kwUDJwSW9MZW5ndGgpOwordm9pZCBwY2kxTWFwUDJwSW9TcGFjZSh1bnNpZ25lZCBpbnQgcGNpMVAycElvQmFzZSwKKwkJICAgICAgIHVuc2lnbmVkIGludCBwY2kxUDJwSW9MZW5ndGgpOworCit2b2lkIHBjaTBNYXBDUFVzcGFjZSh1bnNpZ25lZCBpbnQgcGNpMENwdUJhc2UsIHVuc2lnbmVkIGludCBwY2kwQ3B1TGVuZ3MpOwordm9pZCBwY2kxTWFwQ1BVc3BhY2UodW5zaWduZWQgaW50IHBjaTFDcHVCYXNlLCB1bnNpZ25lZCBpbnQgcGNpMUNwdUxlbmdzKTsKKyNlbmRpZgorCisvKiBQQ0kgcmVnaW9uIG9wdGlvbnMgKi8KKworYm9vbCAgcGNpU2V0UmVnaW9uRmVhdHVyZXMoUENJX0hPU1QgaG9zdCwgUENJX0FDQ0VTU19SRUdJT05TIHJlZ2lvbiwKKwl1bnNpZ25lZCBpbnQgZmVhdHVyZXMsIHVuc2lnbmVkIGludCBiYXNlQWRkcmVzcywKKwl1bnNpZ25lZCBpbnQgcmVnaW9uTGVuZ3RoKTsKKwordm9pZCAgcGNpRGlzYWJsZUFjY2Vzc1JlZ2lvbihQQ0lfSE9TVCBob3N0LCBQQ0lfQUNDRVNTX1JFR0lPTlMgcmVnaW9uKTsKKworLyogUENJIGFyYml0ZXIgKi8KKworYm9vbCBwY2lBcmJpdGVyRW5hYmxlKFBDSV9IT1NUIGhvc3QpOworYm9vbCBwY2lBcmJpdGVyRGlzYWJsZShQQ0lfSE9TVCBob3N0KTsKK2Jvb2wgcGNpU2V0QXJiaXRlckFnZW50c1ByaW9yaXR5KFBDSV9IT1NUIGhvc3QsIFBDSV9BR0VOVF9QUklPIGludGVybmFsQWdlbnQsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MCwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQxLAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDIsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MywKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQ0LAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDUpOworYm9vbCBwY2lTZXRBcmJpdGVyQWdlbnRzUHJpb3JpdHkoUENJX0hPU1QgaG9zdCwgUENJX0FHRU5UX1BSSU8gaW50ZXJuYWxBZ2VudCwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQwLAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDEsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50MiwKKwkJCQkgIFBDSV9BR0VOVF9QUklPIGV4dGVybmFsQWdlbnQzLAorCQkJCSAgUENJX0FHRU5UX1BSSU8gZXh0ZXJuYWxBZ2VudDQsCisJCQkJICBQQ0lfQUdFTlRfUFJJTyBleHRlcm5hbEFnZW50NSk7Citib29sIHBjaVBhcmtpbmdEaXNhYmxlKFBDSV9IT1NUIGhvc3QsIFBDSV9BR0VOVF9QQVJLIGludGVybmFsQWdlbnQsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MCwKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQxLAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDIsCisJCQlQQ0lfQUdFTlRfUEFSSyBleHRlcm5hbEFnZW50MywKKwkJCVBDSV9BR0VOVF9QQVJLIGV4dGVybmFsQWdlbnQ0LAorCQkJUENJX0FHRU5UX1BBUksgZXh0ZXJuYWxBZ2VudDUpOworYm9vbCBwY2lFbmFibGVCcm9rZW5BZ2VudERldGVjdGlvbihQQ0lfSE9TVCBob3N0LCB1bnNpZ25lZCBjaGFyIGJyb2tlblZhbHVlKTsKK2Jvb2wgcGNpRW5hYmxlQnJva2VuQWdlbnREZXRlY3Rpb24oUENJX0hPU1QgaG9zdCwgdW5zaWduZWQgY2hhciBicm9rZW5WYWx1ZSk7CisKKy8qIFBDSS10by1QQ0kgKFAyUCkgKi8KKworYm9vbCBwY2lQMlBDb25maWcoUENJX0hPU1QgaG9zdCwKKwkJICB1bnNpZ25lZCBpbnQgU2Vjb25kQnVzTG93LHVuc2lnbmVkIGludCBTZWNvbmRCdXNIaWdoLAorCQkgIHVuc2lnbmVkIGludCBidXNOdW0sdW5zaWduZWQgaW50IGRldk51bSk7CisvKiBQQ0kgQ2FjaGUtY29oZXJlbmN5ICovCisKK2Jvb2wgcGNpU2V0UmVnaW9uU25vb3BNb2RlKFBDSV9IT1NUIGhvc3QsIFBDSV9TTk9PUF9SRUdJT04gcmVnaW9uLAorCQkJICAgIFBDSV9TTk9PUF9UWVBFIHNub29wVHlwZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgYmFzZUFkZHJlc3MsCisJCQkgICAgdW5zaWduZWQgaW50IHJlZ2lvbkxlbmd0aCk7CisKK1BDSV9ERVZJQ0UgKiBwY2lGaW5kRGV2aWNlKHVuc2lnbmVkIHNob3J0IHZlbiwgdW5zaWduZWQgc2hvcnQgZGV2KTsKKworI2VuZGlmIC8qIF9fSU5DcGNpaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXBsL3BhdGkvY21kX3BhdGkuYyBiL2JvYXJkL21wbC9wYXRpL2NtZF9wYXRpLmMKaW5kZXggY2RhYjI4Ni4uOTg0MjljMCAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL3BhdGkvY21kX3BhdGkuYworKysgYi9ib2FyZC9tcGwvcGF0aS9jbWRfcGF0aS5jCkBAIC0yOTYsOCArMjk2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBDSSBCcmlkZ2UgUmVnaXN0ZXJzIER1bXAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9ib2FyZC9tcGwvcGF0aS9wbHg5MDU2LmggYi9ib2FyZC9tcGwvcGF0aS9wbHg5MDU2LmgKaW5kZXggNzYzYTc5My4uOTYzODU3ZiAxMDA2NDQKLS0tIGEvYm9hcmQvbXBsL3BhdGkvcGx4OTA1Ni5oCisrKyBiL2JvYXJkL21wbC9wYXRpL3BseDkwNTYuaApAQCAtMSwxMTQgKzEsMTE0IEBACi0vKg0KLSAqIChDKSBDb3B5cmlnaHQgMjAwMw0KLSAqIERlbmlzIFBldGVyLCBkLnBldGVyQG1wbC5jaA0KLSAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzDQotICogcHJvamVjdC4NCi0gKg0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcw0KLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mDQotICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQotICoNCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqDQotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sDQotICogTUEgMDIxMTEtMTMwNyBVU0ENCi0gKi8NCi0vKiBQTFg5MDk2IHJlZ2lzdGVyIGRlZmluaXRpb25zDQotKi8NCi0jaWZuZGVmIF9fUExYOTA1Nl9IXw0KLSNkZWZpbmUgX19QTFg5MDU2X0hfCTENCi0NCi0jaW5jbHVkZSA8cGNpLmg+DQotDQotI2lmZGVmIFBMWDkwNTZfTE9DDQotI2RlZmluZSBMT0NBTF9PRkZTRVQJCQkJCTB4MDgwDQotLyogUENJIENvbmZpZyByZWdzICovDQotI2Vsc2UNCi0jZGVmaW5lIExPQ0FMX09GRlNFVAkJCQkJMHgwMDANCi0jZW5kaWYNCi0NCi0jZGVmaW5lIFBDSTkwNTZfVkVORE9SX0lEICAgICAgICAgICAgUENJX1ZFTkRPUl9JRA0KLS8vI2RlZmluZSBQQ0k5NjU2X0RFVklDRV9JRCAgICAgICAgICAgIFBDSV9ERVZJQ0VfSUQNCi0jZGVmaW5lIFBDSTkwNTZfQ09NTUFORCAgICAgICAgICAgICAgUENJX0NPTU1BTkQNCi0vLyNkZWZpbmUgUENJOTY1Nl9TVEFUVVMgICAgICAgICAgICAgICBQQ0lfU1RBVFVTDQotI2RlZmluZSBQQ0k5MDU2X1JFVklTSU9OICAgICAgICAgICAgIFBDSV9SRVZJU0lPTl9JRA0KLQ0KLSNkZWZpbmUgUENJOTA1Nl9DQUNIRV9TSVpFICAgICAgICAgICBQQ0lfQ0FDSEVfTElORV9TSVpFDQotI2RlZmluZSBQQ0k5MDU2X1JUUl9CQVNFICAgICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMA0KLSNkZWZpbmUgUENJOTA1Nl9SVFJfSU9fQkFTRSAgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzENCi0jZGVmaW5lIFBDSTkwNTZfTE9DQUxfQkFTRTAgICAgICAgICAgUENJX0JBU0VfQUREUkVTU18yDQotI2RlZmluZSBQQ0k5MDU2X0xPQ0FMX0JBU0UxICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMw0KLSNkZWZpbmUgUENJOTA1Nl9VTlVTRURfQkFTRTEgICAgICAgICBQQ0lfQkFTRV9BRERSRVNTXzQNCi0jZGVmaW5lIFBDSTkwNTZfVU5VU0VEX0JBU0UyICAgICAgICAgUENJX0JBU0VfQUREUkVTU181DQotI2RlZmluZSBQQ0k5MDU2X0NJU19QVFIgICAgICAgICAgICAgIFBDSV9DQVJEQlVTX0NJUw0KLSNkZWZpbmUgUENJOTA1Nl9TVUJfSUQgICAgICAgICAgICAgICBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRA0KLSNkZWZpbmUgUENJOTA1Nl9FWFBfUk9NX0JBU0UgICAgICAgICBQQ0lfUk9NX0FERFJFU1MNCi0jZGVmaW5lIFBDSTkwNTZfQ0FQX1BUUiAgICAgICAgICAgICAgUENJX0NBUEFCSUxJVFlfTElTVA0KLSNkZWZpbmUgUENJOTA1Nl9JTlRfTElORSAgICAgICAgICAgICBQQ0lfSU5URVJSVVBUX0xJTkUNCi0NCi0jaWYgZGVmaW5lZChQTFg5MDU2X0xPQykNCi0gICAgI2RlZmluZSBQQ0k5MDU2X1BNX0NBUF9JRCAgICAgICAgICAgIDB4MTgwDQotICAgICNkZWZpbmUgUENJOTA1Nl9QTV9DU1IgICAgICAgICAgICAgICAweDE4NA0KLSAgICAjZGVmaW5lIFBDSTkwNTZfSFNfQ0FQX0lEICAgICAgICAgICAgMHgxODgNCi0gICAgI2RlZmluZSBQQ0k5MDU2X1ZQRF9DQVBfSUQgICAgICAgICAgIDB4MThDDQotICAgICNkZWZpbmUgUENJOTA1Nl9WUERfREFUQSAgICAgICAgICAgICAweDE5MA0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9QTFg5MDU2CQkweDkwNTYNCi0NCi0vKiBMb2NhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyBBY2Nlc3NpYmxlIHZpYSB0aGUgUENJIEJhc2UgYWRkcmVzcyArIFZhcmlhYmxlICovDQotI2RlZmluZSBQQ0k5MDU2X1NQQUNFMF9SQU5HRSAgICAgICAgICgweDAwMCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfU1BBQ0UwX1JFTUFQICAgICAgICAgKDB4MDA0ICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9MT0NBTF9ETUFfQVJCSVQgICAgICAoMHgwMDggKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X0VORElBTl9ERVNDICAgICAgICAgICgweDAwYyArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfRVhQX1JPTV9SQU5HRSAgICAgICAgKDB4MDEwICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9FWFBfUk9NX1JFTUFQICAgICAgICAoMHgwMTQgKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X1NQQUNFMF9ST01fREVTQyAgICAgICgweDAxOCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfRE1fUkFOR0UgICAgICAgICAgICAgKDB4MDFjICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9ETV9NRU1fQkFTRSAgICAgICAgICAoMHgwMjAgKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X0RNX0lPX0JBU0UgICAgICAgICAgICgweDAyNCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfRE1fUENJX01FTV9SRU1BUCAgICAgKDB4MDI4ICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9ETV9QQ0lfSU9fQ09ORklHICAgICAoMHgwMmMgKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X1NQQUNFMV9SQU5HRSAgICAgICAgICgweDBmMCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfU1BBQ0UxX1JFTUFQICAgICAgICAgKDB4MGY0ICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9TUEFDRTFfREVTQyAgICAgICAgICAoMHgwZjggKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X0RNX0RBQyAgICAgICAgICAgICAgICgweDBmYyArIExPQ0FMX09GRlNFVCkNCi0NCi0jaWZkZWYgUExYOTA1Nl9MT0MNCi0jZGVmaW5lIFBDSTkwNTZfQVJCSVRFUl9DVFJMICAgICAgICAgMHgxQTANCi0jZGVmaW5lIFBDSTkwNTZfQUJPUlRfQUREUkVTUyAgICAgICAgMHgxQTQNCi0jZW5kaWYNCi0NCi0vKiBSdW50aW1lIHJlZ2lzdGVycyAgUENJIEFkZHJlc3MgKyBMT0NBTF9PRkZTRVQgKi8NCi0jaWZkZWYgUExYOTA1Nl9MT0MNCi0jZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDAJCQkJMHgwQzANCi0jZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDEJCQkJMHgwQzQNCi0jZWxzZQ0KLSNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YMAkJCQkweDA3OA0KLSNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YMQkJCQkweDA3Yw0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YMgkJCQkoMHgwNDggKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X01BSUxCT1gzCQkJCSgweDA0YyArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDQJCQkJKDB4MDUwICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YNQkJCQkoMHgwNTQgKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X01BSUxCT1g2CQkJCSgweDA1OCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDcJCQkJKDB4MDVjICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9QQ0lfVE9fTE9DX0RCRUxMCQkoMHgwNjAgKyBMT0NBTF9PRkZTRVQpDQotI2RlZmluZSBQQ0k5MDU2X0xPQ19UT19QQ0lfREJFTEwJCSgweDA2NCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfSU5UX0NUUkxfU1RBVAkJCSgweDA2OCArIExPQ0FMX09GRlNFVCkNCi0jZGVmaW5lIFBDSTkwNTZfRUVQUk9NX0NUUkxfU1RBVAkJKDB4MDZjICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9QRVJNX1ZFTkRPUl9JRAkJKDB4MDcwICsgTE9DQUxfT0ZGU0VUKQ0KLSNkZWZpbmUgUENJOTA1Nl9SRVZJU0lPTl9JRAkJCSgweDA3NCArIExPQ0FMX09GRlNFVCkNCi0NCi0NCi0jZW5kaWYgLyogI2lmbmRlZiBfX1BMWDkwNTZfSF8gKi8NCi0NCisvKgorICogKEMpIENvcHlyaWdodCAyMDAzCisgKiBEZW5pcyBQZXRlciwgZC5wZXRlckBtcGwuY2gKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisvKiBQTFg5MDk2IHJlZ2lzdGVyIGRlZmluaXRpb25zCisqLworI2lmbmRlZiBfX1BMWDkwNTZfSF8KKyNkZWZpbmUgX19QTFg5MDU2X0hfCTEKKworI2luY2x1ZGUgPHBjaS5oPgorCisjaWZkZWYgUExYOTA1Nl9MT0MKKyNkZWZpbmUgTE9DQUxfT0ZGU0VUCQkJCQkweDA4MAorLyogUENJIENvbmZpZyByZWdzICovCisjZWxzZQorI2RlZmluZSBMT0NBTF9PRkZTRVQJCQkJCTB4MDAwCisjZW5kaWYKKworI2RlZmluZSBQQ0k5MDU2X1ZFTkRPUl9JRCAgICAgICAgICAgIFBDSV9WRU5ET1JfSUQKKy8qI2RlZmluZSBQQ0k5NjU2X0RFVklDRV9JRCAgICAgICAgICAgIFBDSV9ERVZJQ0VfSUQgKi8KKyNkZWZpbmUgUENJOTA1Nl9DT01NQU5EICAgICAgICAgICAgICBQQ0lfQ09NTUFORAorLyojZGVmaW5lIFBDSTk2NTZfU1RBVFVTICAgICAgICAgICAgICAgUENJX1NUQVRVUyAqLworI2RlZmluZSBQQ0k5MDU2X1JFVklTSU9OICAgICAgICAgICAgIFBDSV9SRVZJU0lPTl9JRAorCisjZGVmaW5lIFBDSTkwNTZfQ0FDSEVfU0laRSAgICAgICAgICAgUENJX0NBQ0hFX0xJTkVfU0laRQorI2RlZmluZSBQQ0k5MDU2X1JUUl9CQVNFICAgICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMAorI2RlZmluZSBQQ0k5MDU2X1JUUl9JT19CQVNFICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMQorI2RlZmluZSBQQ0k5MDU2X0xPQ0FMX0JBU0UwICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMgorI2RlZmluZSBQQ0k5MDU2X0xPQ0FMX0JBU0UxICAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfMworI2RlZmluZSBQQ0k5MDU2X1VOVVNFRF9CQVNFMSAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfNAorI2RlZmluZSBQQ0k5MDU2X1VOVVNFRF9CQVNFMiAgICAgICAgIFBDSV9CQVNFX0FERFJFU1NfNQorI2RlZmluZSBQQ0k5MDU2X0NJU19QVFIgICAgICAgICAgICAgIFBDSV9DQVJEQlVTX0NJUworI2RlZmluZSBQQ0k5MDU2X1NVQl9JRCAgICAgICAgICAgICAgIFBDSV9TVUJTWVNURU1fVkVORE9SX0lECisjZGVmaW5lIFBDSTkwNTZfRVhQX1JPTV9CQVNFICAgICAgICAgUENJX1JPTV9BRERSRVNTCisjZGVmaW5lIFBDSTkwNTZfQ0FQX1BUUiAgICAgICAgICAgICAgUENJX0NBUEFCSUxJVFlfTElTVAorI2RlZmluZSBQQ0k5MDU2X0lOVF9MSU5FICAgICAgICAgICAgIFBDSV9JTlRFUlJVUFRfTElORQorCisjaWYgZGVmaW5lZChQTFg5MDU2X0xPQykKKyAgICAjZGVmaW5lIFBDSTkwNTZfUE1fQ0FQX0lEICAgICAgICAgICAgMHgxODAKKyAgICAjZGVmaW5lIFBDSTkwNTZfUE1fQ1NSICAgICAgICAgICAgICAgMHgxODQKKyAgICAjZGVmaW5lIFBDSTkwNTZfSFNfQ0FQX0lEICAgICAgICAgICAgMHgxODgKKyAgICAjZGVmaW5lIFBDSTkwNTZfVlBEX0NBUF9JRCAgICAgICAgICAgMHgxOEMKKyAgICAjZGVmaW5lIFBDSTkwNTZfVlBEX0RBVEEgICAgICAgICAgICAgMHgxOTAKKyNlbmRpZgorCisKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMWDkwNTYJCTB4OTA1NgorCisvKiBMb2NhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyBBY2Nlc3NpYmxlIHZpYSB0aGUgUENJIEJhc2UgYWRkcmVzcyArIFZhcmlhYmxlICovCisjZGVmaW5lIFBDSTkwNTZfU1BBQ0UwX1JBTkdFICAgICAgICAgKDB4MDAwICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X1NQQUNFMF9SRU1BUCAgICAgICAgICgweDAwNCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9MT0NBTF9ETUFfQVJCSVQgICAgICAoMHgwMDggKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfRU5ESUFOX0RFU0MgICAgICAgICAgKDB4MDBjICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X0VYUF9ST01fUkFOR0UgICAgICAgICgweDAxMCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9FWFBfUk9NX1JFTUFQICAgICAgICAoMHgwMTQgKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfU1BBQ0UwX1JPTV9ERVNDICAgICAgKDB4MDE4ICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X0RNX1JBTkdFICAgICAgICAgICAgICgweDAxYyArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9ETV9NRU1fQkFTRSAgICAgICAgICAoMHgwMjAgKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfRE1fSU9fQkFTRSAgICAgICAgICAgKDB4MDI0ICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X0RNX1BDSV9NRU1fUkVNQVAgICAgICgweDAyOCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9ETV9QQ0lfSU9fQ09ORklHICAgICAoMHgwMmMgKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfU1BBQ0UxX1JBTkdFICAgICAgICAgKDB4MGYwICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X1NQQUNFMV9SRU1BUCAgICAgICAgICgweDBmNCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9TUEFDRTFfREVTQyAgICAgICAgICAoMHgwZjggKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfRE1fREFDICAgICAgICAgICAgICAgKDB4MGZjICsgTE9DQUxfT0ZGU0VUKQorCisjaWZkZWYgUExYOTA1Nl9MT0MKKyNkZWZpbmUgUENJOTA1Nl9BUkJJVEVSX0NUUkwgICAgICAgICAweDFBMAorI2RlZmluZSBQQ0k5MDU2X0FCT1JUX0FERFJFU1MgICAgICAgIDB4MUE0CisjZW5kaWYKKworLyogUnVudGltZSByZWdpc3RlcnMgIFBDSSBBZGRyZXNzICsgTE9DQUxfT0ZGU0VUICovCisjaWZkZWYgUExYOTA1Nl9MT0MKKyNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YMAkJCQkweDBDMAorI2RlZmluZSBQQ0k5MDU2X01BSUxCT1gxCQkJCTB4MEM0CisjZWxzZQorI2RlZmluZSBQQ0k5MDU2X01BSUxCT1gwCQkJCTB4MDc4CisjZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDEJCQkJMHgwN2MKKyNlbmRpZgorCisjZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDIJCQkJKDB4MDQ4ICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X01BSUxCT1gzCQkJCSgweDA0YyArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YNAkJCQkoMHgwNTAgKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfTUFJTEJPWDUJCQkJKDB4MDU0ICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X01BSUxCT1g2CQkJCSgweDA1OCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9NQUlMQk9YNwkJCQkoMHgwNWMgKyBMT0NBTF9PRkZTRVQpCisjZGVmaW5lIFBDSTkwNTZfUENJX1RPX0xPQ19EQkVMTAkJKDB4MDYwICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X0xPQ19UT19QQ0lfREJFTEwJCSgweDA2NCArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9JTlRfQ1RSTF9TVEFUCQkJKDB4MDY4ICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X0VFUFJPTV9DVFJMX1NUQVQJCSgweDA2YyArIExPQ0FMX09GRlNFVCkKKyNkZWZpbmUgUENJOTA1Nl9QRVJNX1ZFTkRPUl9JRAkJKDB4MDcwICsgTE9DQUxfT0ZGU0VUKQorI2RlZmluZSBQQ0k5MDU2X1JFVklTSU9OX0lECQkJKDB4MDc0ICsgTE9DQUxfT0ZGU0VUKQorCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9fUExYOTA1Nl9IXyAqLworCg==